我有这样的数据框。
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')
关于如何实现这一目标的任何建议?
答案 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