看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gr99123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
本需求为,根据 date 列时间,计算其是否在前一天 08:00(包含)至当天 08:00(不包含)范围内 data 列值的和。这个过程需要我们对时间数据进行重采样。
本案例在 pandas 2.2 下通过。
我们的原始数据和要得到的结果如下:
# 原数据
import pandas as pd
import io
data = '''
date data
2022-02-01 07:00 1
2022-02-01 08:00 1
2022-02-01 09:00 2
2022-02-01 14:00 1
2022-02-01 23:00 3
2022-02-02 09:00 1
2022-02-03 10:00 2
2022-02-04 11:50 3
'''
期望的结果为:
'''
date data
2022-02-01 1
2022-02-02 7
2022-02-03 1
2022-02-04 2
2022-02-05 3
'''
读取数据:
df = pd.read_csv(io.StringIO(data), sep='\s{2,}', engine='python')
df
# ...
根据需求,我们直接对数据重采样,为了支持时间重采样先将数据转为时间类型,再用 .resample()
重采样后用 sum 聚合:
(
df.astype({'date': 'datetime64[ns]'})
.resample('D', on='date', offset='8h', closed='left')
.sum()
)
'''
data
date
2022-01-31 08:00:00 1
2022-02-01 08:00:00 7
2022-02-02 08:00:00 1
2022-02-03 08:00:00 2
2022-02-04 08:00:00 3
'''
对 .resample()
的参数解释一下,D
是按天为周期,offset 为时间偏移量,默认从零点开始,由于需求是按 8:00 开始,offset 设置为 8h,包括 8 点则设 closed 为 left。on 参数为采样的时间列名。
最后,时间周期需要在后一天,我们将时间索引整体后移一天:
(
df.astype({'date': 'datetime64[ns]'})
.resample('D', on='date', offset='8h', closed='left')
.sum()
.rename(index=lambda x: x + pd.DateOffset(days=1))
)
'''
data
date
2022-02-01 08:00:00 1
2022-02-02 08:00:00 7
2022-02-03 08:00:00 1
2022-02-04 08:00:00 2
2022-02-05 08:00:00 3
'''
这样我们就完成了需求。
(完)
更新时间:2024-08-18 15:56:07 标签:pandas python 周期 分组 时序