2014-10-13 27 views
7

Tôi có một Khung dữ liệu Pandas như dưới đây.Thay đổi tần suất thời gian trong Pandas Dataframe

df 
           A   B 
date_time          
2014-07-01 06:03:59.614000 62.1250  NaN 
2014-07-01 06:03:59.692000 62.2500  NaN 
2014-07-01 06:13:34.524000 62.2500 241.0625 
2014-07-01 06:13:34.602000 62.2500 241.5000 
2014-07-01 06:15:05.399000 62.2500 241.3750 
2014-07-01 06:15:05.399000 62.2500 241.2500 
2014-07-01 06:15:42.004000 62.2375 241.2500 
2014-07-01 06:15:42.082000 62.2375 241.3750 
2014-07-01 06:15:42.082000 62.2375 240.2500 

Tôi muốn thay đổi tần số này để 1 minute đặn. Nhưng hãy gặp lỗi bên dưới:

new = df.asfreq('1Min') 
>>error: cannot reindex from a duplicate axis 

Bây giờ, tôi hiểu tại sao điều này xảy ra. Vì độ chi tiết thời gian của tôi cao (tính bằng mili giây) nhưng không đều, tôi nhận được nhiều lần đọc mỗi phút, thậm chí mỗi giây. Vì vậy, tôi đã cố gắng kết hợp các bài đọc mili giây này vào phút và loại bỏ các bản sao như sau.

# try to convert the index to minutes and drop duplicates 
df['index'] = df.index 
df['minute_index']= df['index'].apply(lambda x: x.strftime('%Y-%m-%d %H:%M')) 
df.drop_duplicates(cols = 'minute_index', inplace = True, take_last = True) 
df_by_minute = df.set_index('minute_index') 
df_by_minute 
         A    B    index 
minute_index              
2014-07-01 06:03 62.2500  NaN 2014-07-01 06:03:59.692000 
2014-07-01 06:13 62.2500  241.50 2014-07-01 06:13:34.602000 
2014-07-01 06:15 62.2375  240.25 2014-07-01 06:15:42.082000 

# now change the frequency to 1 minute but I just get NaNs (!) 
df_by_minute.asfreq('1Min') 
          A   B index 
2014-07-01 06:03:00  NaN  NaN NaT 
2014-07-01 06:04:00  NaN  NaN NaT 
2014-07-01 06:05:00  NaN  NaN NaT 
2014-07-01 06:06:00  NaN  NaN NaT 
2014-07-01 06:07:00  NaN  NaN NaT 
2014-07-01 06:08:00  NaN  NaN NaT 
2014-07-01 06:09:00  NaN  NaN NaT 
2014-07-01 06:10:00  NaN  NaN NaT 
2014-07-01 06:11:00  NaN  NaN NaT 
2014-07-01 06:12:00  NaN  NaN NaT 
2014-07-01 06:13:00  NaN  NaN NaT 
2014-07-01 06:14:00  NaN  NaN NaT 
2014-07-01 06:15:00  NaN  NaN NaT 

Như bạn thấy nó không hoạt động .. Ai đó có thể trợ giúp? Những gì tôi đang cố gắng đạt được là để có được một hàm trả về A or B as of DateTime và DateTime sẽ có gia số 1Min.

Trả lời

4

Tôi nghĩ rằng, không asfreq nhưng resample phù hợp với nhu cầu của bạn:

new = df.resample('T', how='mean') 

Đối how tùy chọn, bạn cũng có thể sử dụng 'cuối cùng' hoặc 'đầu tiên'.

+0

cảm ơn bạn! Khá bực bội khi tôi hoàn toàn bỏ qua chức năng này. – Rhubarb