python - Pandas 如何在特定日期和日期范围内的总和值之间重新采样?

标签 python pandas pandas-groupby

(此问题是 How to use pandas Grouper with 7d frequency and fill missing days with 0? 的后续问题)

我有以下数据框

df = pd.DataFrame({
    'names': ['joe', 'joe', 'joe'],
    'dates': [dt.datetime(2019,6,1), dt.datetime(2019,6,5), dt.datetime(2019,7,1)],
    'start_date': dt.datetime(2019,5,1),
    'end_date': dt.datetime(2019,7,5),
    'values': [5,2,13]
})

  names      dates start_date   end_date  values
0   joe 2019-06-01 2019-05-01 2019-07-05       5
1   joe 2019-06-05 2019-05-01 2019-07-05       2
2   joe 2019-07-01 2019-05-01 2019-07-05      13

我想在 7 天的时间段内对数据进行重新采样,日期范围由 start_date 定义和end_date .

通过使用以下解决方法,我能够实现我正在寻找的结果

temp_df = pd.DataFrame({
    'dates': [df.start_date.tolist()[0], dt.end_date.tolist()[0]],
    'names': df.names.tolist()[0],
    'values': 0
})

concat_df = pd.concat([df, temp_df], axis=0, sort=True)

concat_df.set_index('dates').groupby('names').resample('7D').sum()

输出

                  values
names dates             
joe   2019-05-01       0
      2019-05-08       0
      2019-05-15       0
      2019-05-22       0
      2019-05-29       5
      2019-06-05       2
      2019-06-12       0
      2019-06-19       0
      2019-06-26      13
      2019-07-03       0

这就是我正在寻找的。

我很确定有更好的方法来实现这一目标。您有什么建议吗?

谢谢!

最佳答案

您只需重新索引当前时间序列,避免使用 pd.concat 即可产生更好的结果。

df.set_index('dates', inplace=True)
def groupbyResample(groupby):
    date_range = pd.date_range(groupby.start_date.min(), groupby.end_date.max(), 
                               freq='d', name='date_index')

    return date_range.to_frame(name='dates').join(groupby).resample('7D')['values'].sum()

df.groupby('names').apply(groupbyResample).stack()

结果:

names  date_index
joe    2019-05-01     0.0
       2019-05-08     0.0
       2019-05-15     0.0
       2019-05-22     0.0
       2019-05-29     5.0
       2019-06-05     2.0
       2019-06-12     0.0
       2019-06-19     0.0
       2019-06-26    13.0
       2019-07-03     0.0
dtype: float64

使用魔法函数%%timeit:

%%timeit
def groupbyResample(groupby):
..
7.9 ms ± 352 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

你的方法:

%%timeit
temp_df = pd.DataFrame({ ..
9.1 ms ± 394 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

没有太多的性能增强,但是,使用函数确实可以很好地扩展,并且您不需要自己编写大量代码。话虽这么说,我仍然觉得有一种更惯用的方法来做到这一点。

关于python - Pandas 如何在特定日期和日期范围内的总和值之间重新采样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57327788/

相关文章:

python - groupby 并返回前 n 组的所有行

Python,循环遍历字符串并在特定单词的开头和结尾更改位置字符

python - 查找每列的最新行

python - 如何查找二维数组的按列唯一元素及其频率

python - 使用 Pandas 快速去除标点符号

python - 根据条件为自定义列分配值

python - 曲面上的建模点

python - 向固定宽度文本文件添加分隔符

python - 将系列转换为字典?

python - 如何在python中对具有相似文本的数据框进行分组