熊猫按天重新采样,而不会填写缺失的日期

Pandas resample by day without filling missing dates

提问人:Luiscri 提问时间:2/10/2021 更新时间:2/10/2021 访问量:1599

问:

我有一个数据集,其中包含多个日期字段,包括小时数。我想使用其中一个作为我的 df 索引,并计算每天创建的条目数。换句话说,如果我有:

Date | Several features
2020-02-08 10h00 | ...
2020-02-08 11h00 | ...
2020-02-10 10h00 | ...
2020-02-10 11h00 | ...
2020-02-10 13h00 | ... 

我想要得到:

2020-02-08 | 2
2020-02-10 | 3

为此,我正在做:

df["datetime"] = pd.to_datetime(df["datetime"])
df = df.set_index('datetime')
df.resample('D')["id"].count()

其中 是每个条目具有的唯一标识符。id

但是,我得到以下输出:

2020-02-08 | 2
2020-02-09 | 0
2020-02-10 | 3

如何删除“2020-02-09”行?我只想计算数据集上出现的天数,而不是我没有的天数。

蟒蛇 熊猫

评论

0赞 Mayank Porwal 2/10/2021
IMO,不是必需的。只是一个或应该给你答案。resamplegroupbycount()size()

答:

2赞 jezrael 2/10/2021 #1

Series.dt.dateDataFrame.groupby 一起使用:

df["datetime"] = pd.to_datetime(df["datetime"])
df = df.groupby(df["datetime"].dt.date)["id"].count()

如果需要在较旧的 pandas 版本中也能很好地工作,请使用 Series.dt.normalizeDatetimeIndex

df["datetime"] = pd.to_datetime(df["datetime"])
df = df.groupby(df["datetime"].dt.normalize())["id"].count()

在解决方案中,如果生成了缺失值,请将其删除:

df["datetime"] = pd.to_datetime(df["datetime"])
df = df.set_index('datetime').resample('D')["id"].count().dropna()

或删除行:0

df["datetime"] = pd.to_datetime(df["datetime"])
df = df.set_index('datetime').resample('D')["id"].count().loc[lambda x: x!= 0]

评论

0赞 Quang Hoang 2/10/2021
我会远离,因为 Pandas 玩得不是很好。dt.datedatetime.date
1赞 jezrael 2/10/2021
@QuangHoang - 是的,在一些较旧的版本中,在新的版本中应该效果更好,但同意,我可以添加规范化替代方案。谢谢。
0赞 Luiscri 2/10/2021
谢谢你的回答。如果我使用您的解决方案,然后我想按月分组,是否有可能,或者在这种情况下,我应该使用我的方法并选择?@jezrael.resample('M')
1赞 jezrael 2/10/2021
@Luiscri Tnes 是可能的,使用我的答案中的重采样解决方案或df = df.groupby(df["datetime"].dt.to_period('m')) ["id"].count()