2015-01-27 11 views
1

에 대한 다음 고유의 날짜와 에포크 시간을 돌아 , 정렬. 다음과 같은 : 나는 Dataframe에서 고유 한 날짜를 반환 할 때 [1424390400, 1440115200, 1452816000]정렬 팬더 Dataframe는, 내가 팬더 dataframe이 정상이

을하지만 수 : 올바르지 않은 시간을 보여줍니다 ['2015-02-19T18:00:00.000000000-0600' '2016-01-14T18:00:00.000000000-0600' '2015-08-20T19:00:00.000000000-0500']

; 그들은 하루 종일 끝난다.

날짜별로 정렬하고 고유 한 값을 반환 한 다음 시간이 00:00:00 인 시간대로 변환하려면 어떻게해야합니까? 미리 감사드립니다.

import pandas as pd 

df =pd.DataFrame({'Symbol':['A','A','A','A'] ,'Date' 
    ['02/20/2015','01/15/2016', '01/15/2016','08/21/2015']}) 

df['Date'] = pd.to_datetime(df.Date) 
dates = df['Date'].unique() 
print dates 
+0

이것은 이상한 것입니다. 그것은 나에게 버그와 같은 느낌이 들지만 어쩌면 후드 아래에서 무슨 일이 벌어지고 있는지 아는 누군가가 대답을 올릴 것입니다. – andrew

답변

1

는, 당신이 df['Date'].unique()를 호출 할 때 시간이 변경지고 나타납니다. Pandas unique() 메서드는 Numpy ndarray를 반환합니다. 그래서 이것은 실제로 pandas Timestamps에서 Numpy datetime64 유형으로 컬럼 요소를 캐스팅합니다. 이 프로세스는 이상한 시간대와 시프트를 적용합니다. 우리가 t.value를 호출하여 나노초 값을 얻을 수 df['Date']있는 타임 스탬프의 요소 이후

dates = df['Date'].map(lambda t: t.value/(10**9)).unique()

다음에 10^9 분할 :

고유 획기적인 시간 정수의 목록을 얻으려면 시도 에포크 초로 변환하십시오.

0

을 Heres 유일한 해킹 내가 가지고 올 수 :

는 여기에 지금까지 가지고있는 데모 스크립트입니다.

import pandas as pd 
import numpy as np 
df =pd.DataFrame({'Symbol':['A','A','A','A'] ,'Date':['02/20/2015','01/15/2016', '01/15/2016','08/21/2015']}) 

df['Date'] = pd.to_datetime(df.Date) 
df = df.sort('Date') 
dates = [] 
seen = [] 
for i in df['Date']: 
    if i in seen: 
     continue 
    else: 
     seen.append(i) 
     dates.append(str(i).split(' ')[0]) 
    if len(dates)==2: 
     break 
print dates 

그리고 그 사용하여 획기적인로 변환

: 일부 실험 후

for i in dates: 
    cur_dates = i.split('-') 
    epoch = int((datetime(int(cur_dates[0]),int(cur_dates[1]),int(cur_dates[2]),0,0) - datetime(1970,1,1)).total_seconds()) 
    epoch = str(epoch) 
+0

이렇게 힘들지 않아도됩니다! 내 하나의 라이너를 확인하십시오. – andrew

+0

그래, 나는지도 기능을 배우려고 힘써야 해. 감사! – mobone

3

이것은 버그가 아니며 numpy가 표시된 'issue'입니다. Numpy는 로컬 시간대로 datetimes를 표시하기로 선택했습니다 (역사적인 이유로 생각합니다).

In [21]: df['Date'].unique() 
Out[21]: 
array(['2015-02-19T19:00:00.000000000-0500', 
     '2016-01-14T19:00:00.000000000-0500', 
     '2015-08-20T20:00:00.000000000-0400'], dtype='datetime64[ns]') 

DatetimeIndex로 변환하십시오 (pandas는 compat 이유로 numpy-array로 고유 한 값을 반환 함).

In [22]: pd.DatetimeIndex(df['Date'].unique()) 
Out[22]: 
<class 'pandas.tseries.index.DatetimeIndex'> 
[2015-02-20, ..., 2015-08-21] 
Length: 3, Freq: None, Timezone: None 

약간의 수학으로 초를 얻을 수 있습니다. 언더 데이터는 ns 정밀도로 저장됩니다.

In [23]: pd.DatetimeIndex(df['Date'].unique()).asi8/10**9 
Out[23]: array([1424390400, 1452816000, 1440115200]) 

이 모든 것이 벡터화되어 있으므로 매우 빠릅니다.

관련 문제