python - Pandas 如何在特定日期和日期范围内的总和值之间重新采样?
问题描述
(这个问题是如何使用 7d 频率的 pandas Grouper 并用 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 - 如何使用Python找到一定范围内每个偶数的总和?
- javascript - 是否有一个函数可以将函数列表应用于 Ramda 中的值列表?
- python - 合并具有相同索引的数据框列表
- python - 有没有办法从网站下载文件并将其直接上传到 Google Drive?
- arrays - Postgresql 数组总和
- python - 如何使用步幅从单个图像创建多个图像?
- c++ - 我怎样才能尽可能快地做到这一点?- 遍历图像垫
- linux - 在 ubuntu 上更改 PIL 中的 Image.core.jpeglib 版本
- java - 为什么在 Android Studio 中不会逐行执行?
- css - 有没有办法动态改变 ng-cicle-progress CircleProgressComponent 元素的大小?