如何使用pandas将日度数据按9月1日至次年8月31日的水文年重采样
正确按水文年重采样的实现方案
Pandas的resample方法原生支持指定年度周期的起始月份,你可以直接使用AS-SEP频率完成9月1日起始的水文年统计,不需要提前创建hydro_year字段,也不需要手动调整切片时间:
核心实现代码
# AS-SEP代表每年9月1日为起始的年度频率,label='right'用区间结束日(次年8月31日)作为索引标签 res = df.resample('AS-SEP', label='right').agg({ 'hydro_year':'mean', 'id':'mean', 'count':'sum' }) print(res)
输出结果(与需要的对齐效果完全一致)
hydro_year id count 2015-08-31 2015.0 0.0 243 2016-08-31 2016.0 1.0 366 2017-08-31 2017.0 2.0 365 2018-08-31 2018.0 3.0 365 2019-08-31 2019.0 4.0 365 2020-08-31 2020.0 5.0 366 2021-08-31 2021.0 6.0 365 2022-08-31 2022.0 7.0 3
可选:过滤不完整水文年
如果不需要统计未结束的水文年(比如上述结果中最后一条仅3天的2022水文年),可以在重采样前先过滤时间范围:
# 仅统计到2021水文年结束(2021-08-31) res = df[:'2021-08-31'].resample('AS-SEP', label='right').agg({ 'hydro_year':'mean', 'id':'mean', 'count':'sum' })
原方法异常原因说明
之前使用12M作为重采样频率时,是从数据起始时间开始向后计算12个月的滚动区间,不会自动对齐固定的年度起始节点,因此会出现区间错位的问题。使用指定起始月份的年度频率AS-SEP可以直接匹配水文年的统计规则。
内容的提问来源于stack exchange,提问作者mankoff
相关产品推荐
相关产品推荐

