2013-07-22 5 views
4

저는 timeseries의 여러 스프레드 시트를 팬더 dataFrame으로 읽고 일반적인 팬더 datetime 인덱스와 함께 연결합니다. timeseries를 기록한 데이터 로거는 100 % 정확하지 않으므로 리샘플링이 매우 짜증나게됩니다. 샘플링되는 간격보다 약간 높거나 낮 으면 NaN이 생성되어 내 시리즈가 파손 된 선으로 보이기 시작합니다. 여기에 내 코드라운드 팬더 datetime 인덱스?

def loaddata(filepaths): 
    t1 = time.clock() 
    for i in range(len(filepaths)): 
     xl = pd.ExcelFile(filepaths[i]) 
     df = xl.parse(xl.sheet_names[0], header=0, index_col=2, skiprows=[0,2,3,4], parse_dates=True) 
     df = df.dropna(axis=1, how='all') 
     df = df.drop(['Decimal Year Day', 'Decimal Year Day.1', 'RECORD'], axis=1) 

     if i == 0: 
      dfs = df 
     else: 
      dfs = concat([dfs, df], axis=1) 
    t2 = time.clock() 
    print "Files loaded into dataframe in %s seconds" %(t2-t1) 

files = ["London Lysimeters corrected 5min.xlsx", "London Water Balance 5min.xlsx"] 
data = loaddata(files) 

는 여기 인덱스의 생각 :

data.index

클래스 'pandas.tseries.index.DatetimeIndex'> [2012년 8월 27일 12 : 05 : 00.000002, ..., 2013년 7월 12일 15 : 10 : 00.000004] 길이 : 91910, 주파수 : 없음, 시간대 : 없음은

어떤 것이 가장 빠르고 인덱스를 가장 가까운 분으로 반올림하는 일반?

답변

6

여기에 약간의 묘기가 있습니다. 데이터 시간은 나노초 단위입니다 (np.int64으로 표시). 나노초 단위로 반올림합니다.

In [75]: index = pd.DatetimeIndex([ Timestamp('20120827 12:05:00.002'), Timestamp('20130101 12:05:01'), Timestamp('20130712 15:10:00'), Timestamp('20130712 15:10:00.000004') ]) 

In [79]: index.values 
Out[79]: 
array(['2012-08-27T08:05:00.002000000-0400', 
     '2013-01-01T07:05:01.000000000-0500', 
     '2013-07-12T11:10:00.000000000-0400', 
     '2013-07-12T11:10:00.000004000-0400'], dtype='datetime64[ns]') 

In [78]: pd.DatetimeIndex(((index.asi8/(1e9*60)).round()*1e9*60).astype(np.int64)).values 
Out[78]: 
array(['2012-08-27T08:05:00.000000000-0400', 
     '2013-01-01T07:05:00.000000000-0500', 
     '2013-07-12T11:10:00.000000000-0400', 
     '2013-07-12T11:10:00.000000000-0400'], dtype='datetime64[ns]') 
+0

완벽하게 작동하며 매우 빠릅니다! 나는 당신이 이런 식으로 datetimeindex를 처리 할 수 ​​있다는 것을 몰랐다. – pbreach

+0

실제로 두포에서 그들을 처리하는 방법이있다. (이것은''인덱스''가 대부분을 숨긴다) – Jeff

+3

이것은 인덱스에 더할 나위없이 좋을 수도있다. 코드, 당신은이 문제를 따를 수 있습니다 : https://github.com/pydata/pandas/issues/4314 – Jeff

0

데이터 열의 경우; 사용 : 제프 언급 round_hour (df.Start_time)

def round_hour(x,tt=''): 
    if tt=='M': 
     return pd.to_datetime(((x.astype('i8')/(1e9*60)).round()*1e9*60).astype(np.int64)) 
    elif tt=='H': 
     return pd.to_datetime(((x.astype('i8')/(1e9*60*60)).round()*1e9*60*60).astype(np.int64)) 
    else: 
     return pd.to_datetime(((x.astype('i8')/(1e9)).round()*1e9).astype(np.int64)) 
4

문제 4314 이제 닫히고 round() 방법은 팬더 0.18.0에 DatetimeIndex, 타임 스탬프, TimedeltaIndex 및 Timedelta 추가되었다. 이제 우리는 다음을 할 수 있습니다 :

In[109]: index = pd.DatetimeIndex([pd.Timestamp('20120827 12:05:00.002'), pd.Timestamp('20130101 12:05:01'), pd.Timestamp('20130712 15:10:30'), pd.Timestamp('20130712 15:10:31')]) 

In[110]: index.values 
Out[110]: 
array(['2012-08-27T12:05:00.002000000', '2013-01-01T12:05:01.000000000', 
     '2013-07-12T15:10:30.000000000', '2013-07-12T15:10:31.000000000'], dtype='datetime64[ns]') 

In[111]: index.round('min') 
Out[111]: 
DatetimeIndex(['2012-08-27 12:05:00', '2013-01-01 12:05:00', 
       '2013-07-12 15:10:00', '2013-07-12 15:11:00'], 
       dtype='datetime64[ns]', freq=None) 

round() 주파수 매개 변수를 허용합니다. 문자열 별칭은 here입니다.

+0

예,'round()'가 해결했습니다! –

관련 문제