pandas groupby日期最早每天选择

时间:2017-10-06 19:34:36

标签: python pandas

我有以下数据集:

            value            timestamp
0            Fire  2017-10-03 14:33:52
1           Water  2017-10-04 14:33:48
2            Fire  2017-10-04 14:33:45
3            Fire  2017-10-05 14:33:30
4           Water  2017-10-03 14:33:40
5           Water  2017-10-05 14:32:13
6           Water  2017-10-04 14:32:01
7            Fire  2017-10-03 14:31:55

我想每天按timestamp对此设置进行分组,然后只选择每天最早的行。对于上面的示例,结果如下:

            value            timestamp
1           Water  2017-10-05 14:32:13
2           Water  2017-10-04 14:32:01
3            Fire  2017-10-03 14:31:55

例如,对于2017-10-03这一天,有3个条目,但我只想要那天最早的条目。

4 个答案:

答案 0 :(得分:4)

如果您有唯一索引,则可以使用idxmin上的timestamp查找最小时间戳的索引,并使用loc提取它们:< / p>

df.timestamp = pd.to_datetime(df.timestamp)
df.loc[df.groupby(df.timestamp.dt.date, as_index=False).timestamp.idxmin()]

#   value             timestamp
#7   Fire   2017-10-03 14:31:55
#6  Water   2017-10-04 14:32:01
#5  Water   2017-10-05 14:32:13

答案 1 :(得分:3)

只是确定

df.timestamp = pd.to_datetime(df.timestamp)

解决方案

d1 = df.sort_values('timestamp')
d1[~d1.timestamp.dt.date.duplicated()]

   value           timestamp
7   Fire 2017-10-03 14:31:55
6  Water 2017-10-04 14:32:01
5  Water 2017-10-05 14:32:13

答案 2 :(得分:2)

使用dt.floorhead

df.sort_values('timestamp').groupby(df['timestamp'].dt.floor('D')).head(1)

输出:

   value           timestamp
7   Fire 2017-10-03 14:31:55
6  Water 2017-10-04 14:32:01
5  Water 2017-10-05 14:32:13

答案 3 :(得分:1)

df.groupby(df.timestamp.dt.date).apply(lambda x:x[x.timestamp==min(x.timestamp)])
Out[714]: 
              value           timestamp
timestamp                              
2017-10-03 7   Fire 2017-10-03 14:31:55
2017-10-04 6  Water 2017-10-04 14:32:01
2017-10-05 5  Water 2017-10-05 14:32:13