You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何计算带时间索引DataFrame中每年8月起始周期的数值变化

计算以每年8月为周期起始的DataFrame月度差值

问题背景

有一个以日期为索引的DataFrame,业务周期以每年8月为起始点,需要计算每个月的value1、value2与对应周期起始(上一个8月)的数值之差,以此分析周期内的数值变化。

解决方案步骤

  1. 标准化时间索引:将字符串类型的索引转换为datetime类型,确保后续时间操作有效。
  2. 定义周期分组:根据日期的月份判断所属周期:
    • 若月份≥8,周期起始年为当前年份(周期范围:当前年8月-次年7月)
    • 若月份<8,周期起始年为前一年(周期范围:前一年8月-当前年7月)
  3. 提取周期起始值:针对每个周期,提取当年8月的数值,再将该值匹配到整个周期的所有月份。
  4. 计算差值:用原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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 11:37:25