【问题标题】:Pandas resample by day without filling missing dates熊猫按天重新采样而不填写缺失的日期
【发布时间】:2023-03-14 01:59:01
【问题描述】:

我有一个包含几个日期字段的数据集,包括小时数。我想将其中一个用作我的 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”行?我只想计算我的数据集上出现的日子,而不是我没有的日子。

【问题讨论】:

  • IMO,resample 不是必需的。只需 groupbycount()size() 即可为您提供答案。

标签: python pandas


【解决方案1】:

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

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

如果需要 DatetimeIndex 在较旧的 pandas 版本中也能正常工作,请使用 Series.dt.normalize

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]

【讨论】:

  • 我会远离 dt.date,因为 Pandas 不能很好地与 datetime.date 配合使用。
  • @QuangHoang - 是的,在一些较旧的版本中,在新版本中应该工作得更好,但同意,我可以添加规范化替代方案。谢谢。
  • 感谢您的回答。如果我使用您的解决方案,然后我想按月分组,是否有可能或者在这种情况下我应该使用我的方法并选择 .resample('M') ? @jezrael
  • @Luiscri Tnes 可以使用我的答案或df = df.groupby(df["datetime"].dt.to_period('m')) ["id"].count() 中的重采样解决方案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-01-17
  • 1970-01-01
  • 1970-01-01
  • 2014-08-06
  • 1970-01-01
  • 2016-08-06
  • 1970-01-01
相关资源
最近更新 更多