如何计算带时间索引DataFrame中每年8月起始周期的数值变化
计算以每年8月为周期起始的DataFrame月度差值
问题背景
有一个以日期为索引的DataFrame,业务周期以每年8月为起始点,需要计算每个月的value1、value2与对应周期起始(上一个8月)的数值之差,以此分析周期内的数值变化。
解决方案步骤
- 标准化时间索引:将字符串类型的索引转换为
datetime类型,确保后续时间操作有效。 - 定义周期分组:根据日期的月份判断所属周期:
- 若月份≥8,周期起始年为当前年份(周期范围:当前年8月-次年7月)
- 若月份<8,周期起始年为前一年(周期范围:前一年8月-当前年7月)
- 提取周期起始值:针对每个周期,提取当年8月的数值,再将该值匹配到整个周期的所有月份。
- 计算差值:用原DataFrame的数值减去对应周期的起始值,得到每个月的变化量。
完整代码实现
import pandas as pd import numpy as np # 原数据 df = pd.DataFrame({'date': ['2022-01-01 00:00:00', '2022-02-01 00:00:00', '2021-03-01 00:00:00', '2021-04-01 00:00:00', '2021-05-01 00:00:00', '2021-06-01 00:00:00', '2021-07-01 00:00:00', '2021-08-01 00:00:00', '2021-09-01 00:00:00', '2021-10-01 00:00:00', '2021-11-01 00:00:00', '2021-12-01 00:00:00', '2022-01-01 00:00:00', '2022-02-01 00:00:00', '2022-03-01 00:00:00', '2022-04-01 00:00:00', '2022-05-01 00:00:00', '2022-06-01 00:00:00', '2022-07-01 00:00:00', '2022-08-01 00:00:00', '2022-09-01 00:00:00', '2022-10-01 00:00:00', '2022-11-01 00:00:00', '2023-12-01 00:00:00', '2023-01-01 00:00:00', '2023-02-01 00:00:00', '2023-03-01 00:00:00', '2023-04-01 00:00:00', '2023-05-01 00:00:00', '2023-06-01 00:00:00', ], 'value1': [0.452762281,0.372262281,0.513928948,0.447762281, 0.377095615,0.355095615,0.271428948,0.291762281, 0.476762281,0.335928948,0.280428948,0.283762281, 0.322928948,0.287262281,0.316928948,0.209262281, 0.407928948,0.254262281,0.232095615,0.264262281, 0.076095615,-0.025237719,-0.042237719,-0.094904385, 0.017428948,-0.036071052,-0.094071052,-0.071404385, 0.008095615,-0.141571052], 'value2': [9.6,8,8.4,6.2,6.2,6,3.9,8.5,8.3,5.3,5.6,5.3, 6.2,6.3,6.9,4.8,6.7,3.6,3,4.6,2.3,1.3,1,0.3, 1.6,0.4,1.5,1.4,2.2,1.2]}) # 1. 转换索引为datetime类型并排序 df.index = pd.to_datetime(df.index) df = df.sort_index() # 2. 定义每个日期所属的周期起始年 df['period_start_year'] = np.where(df.index.month >= 8, df.index.year, df.index.year - 1) # 3. 提取每个周期8月的基准值并匹配到对应周期 base_values = df[df.index.month == 8].set_index('period_start_year')[['value1', 'value2']] df = df.merge(base_values, left_on='period_start_year', right_index=True, suffixes=('', '_base')) # 4. 计算每个月与周期起始值的差值 df['value1_diff'] = df['value1'] - df['value1_base'] df['value2_diff'] = df['value2'] - df['value2_base'] # 查看结果(可选) print(df[['value1', 'value1_base', 'value1_diff', 'value2', 'value2_base', 'value2_diff']])
代码解释
- 索引转换与排序:确保时间序列有序,避免后续分组匹配出错。
- 周期起始年计算:通过
np.where判断月份,为每个日期分配对应的周期起始年份,比如2022年1月属于2021年8月开始的周期,因此period_start_year为2021。 - 基准值匹配:筛选所有8月的数据作为周期基准,通过
merge操作将基准值匹配到对应周期的所有月份,实现“广播”效果。 - 差值计算:直接用原数值减去基准值,得到每个月相对于周期起始点的变化量。
内容的提问来源于stack exchange,提问作者Ferran
相关产品推荐
相关产品推荐

