按天重新采样 Pandas 数据框,不填充缺失日期

3

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

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”这一行?我只想统计数据集中已有的日期,而不是没有的日期。


在我看来,“resample” 不是必需的。只需要使用 groupbycount()size() 就可以得到答案。 - Mayank Porwal
1个回答

2

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

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

如果需要在旧版本的pandas中使用DatetimeIndex,可以使用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 的兼容性不是很好。 - Quang Hoang
1
@QuangHoang - 是的,在一些旧版本中可能会有问题,在新版本中应该会更好,但同意,我可以添加规范化的替代方案。谢谢。 - jezrael
谢谢你的回答。如果我使用你的解决方案,然后想按月分组,是否可能?还是在这种情况下,我应该采用我的方法并使用.resample('M')?@jezrael - Luiscri
1
@Luiscri,你可以使用我的答案中的重采样解决方案或者df = df.groupby(df["datetime"].dt.to_period('m')) ["id"].count() - jezrael

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接