熊猫,删除重复的日期时间

时间:2015-04-10 10:52:28

标签: python pandas

我有这样的数据框。

       timestamp         avg_hr  avg_rr    emfit_sleep_summary_id   AVG_HR    AVG_RR
 2015-01-28 08:14:50     101     6.4                      78         99.5       6.4 
 2015-01-28 08:14:52      98     6.4                      78         99.5       6.4
 2015-01-28 00:25:00      60     0.0                      78         61.5       0.0
 2015-01-28 00:25:02      63     0.0                      78        61.5       0.0
 2015-01-28 07:24:06      79    11.6                      78        78.5       11.6
 2015-01-28 07:24:08      79    11.6                      78        78.5       11.6

时间戳是索引。我正在尝试删除重复的时间戳(按小时),所以而不是上面的表我试图得到类似下面的内容。

      timestamp         avg_hr  avg_rr    emfit_sleep_summary_id    AVG_HR    AVG_RR
 2015-01-28 08:14:50     101     6.4                      78         99.5       6.4 
 2015-01-28 00:25:02      63     0.0                      78         61.5       0.0
 2015-01-28 07:24:08      79    11.6                      78         78.5       11.6

我尝试了以下内容。

df2 = df2.drop_duplicates(subset=df2.index.hour,take_last=True)

但返回s Keyerror: 22

我也尝试过:df2 = df2.drop_duplicates(subset=df2.index,take_last=True)

返回KeyError: Timestamp('2015-03-31 22:29:48')

关于如何实现这一目标的任何建议?

2 个答案:

答案 0 :(得分:2)

使用重新采样:

In [52]:

df.resample('H', how='first').dropna(how='all')
Out[52]:
                    avg_hr  avg_rr  emfit_sleep_summary_id  AVG_HR  AVG_RR
timestamp                   
2015-01-28 00:00:00 60      0.0                         78  61.5    0.0
2015-01-28 07:00:00 79      11.6                        78  78.5    11.6
2015-01-28 08:00:00 101     6.4                         78  99.5    6.4

使用.dropna()的原因是每小时重新采样会在第一个和最后一个之间创建每小时的行,如果一小时内没有数据,则会用NaN填充。

答案 1 :(得分:1)

我重置索引以使其成为一个列,这允许您在其上调用apply,然后对于每个日期时间应用一个调用replace的lambda并将该分钟归零秒属性,然后删除重复项并重新设置索引:

In [51]:

df = df.reset_index()
df['timestamp'] = df['timestamp'].apply(lambda x: x.replace(minute=0, second=0))
df = df.drop_duplicates(subset='timestamp', take_last=True)
df = df.set_index('timestamp')
df
Out[51]:
                     avg_hr  avg_rr  emfit_sleep_summary_id  AVG_HR  AVG_RR
timestamp                                                                  
2015-01-28 08:00:00      98     6.4                      78    99.5     6.4
2015-01-28 00:00:00      63     0.0                      78    61.5     0.0
2015-01-28 07:00:00      79    11.6                      78    78.5    11.6