如何基于日期而非周期数计算带Datetime Index的Dataframe同比变化率
基于日期批量计算多频率时间序列的同比变化率
完全可以基于日期来批量计算不同频率序列的同比变化率,不用手动指定固定周期数,核心是利用pandas的日期偏移功能匹配去年同期数据。
实现步骤
- 统一管理Dataframe:把所有需要处理的Dataframe放进一个字典里,方便批量遍历。
- 匹配去年同期数据:对每个Dataframe的日期索引减去1年,生成去年同期的日期序列,再用
reindex匹配对应的值。 - 计算同比并新增列:用当前值减去去年同期值,再除以去年值得到同比变化率,作为新列添加到原Dataframe中。
完整代码示例
import pandas as pd # 把你的Dataframe存入字典(替换成实际变量名) dataframes = { 'gdp': gdp, 'pce': pce, 'spx': spx } # 批量遍历处理每个Dataframe for df_name, df in dataframes.items(): # 假设每个Dataframe只有一列,获取列名 target_col = df.columns[0] # 生成去年同期的日期索引 last_year_dates = df.index - pd.DateOffset(years=1) # 匹配去年同期的数值 last_year_values = df[target_col].reindex(last_year_dates).values # 计算同比变化率,新增列命名为「原列名_YoY」 df[f'{target_col}_YoY'] = (df[target_col] - last_year_values) / last_year_values
扩展说明
- 多列Dataframe适配:如果你的Dataframe包含多列,只需把代码里的
target_col = df.columns[0]改成遍历所有列即可,示例如下:for df_name, df in dataframes.items(): for target_col in df.columns: last_year_dates = df.index - pd.DateOffset(years=1) last_year_values = df[target_col].reindex(last_year_dates).values df[f'{target_col}_YoY'] = (df[target_col] - last_year_values) / last_year_values - 缺失值处理:如果去年同期没有对应日期(比如日度数据的节假日),
reindex会返回NaN,对应的同比值也会是NaN,符合实际业务逻辑。 - 自动适配频率:不管是季度、月度还是日度数据,都不需要手动设置周期数,完全基于日期匹配,避免了固定周期数带来的误差(比如日度数据每年交易日数不一定是252)。
内容的提问来源于stack exchange,提问作者Galos Prigipas
相关产品推荐
相关产品推荐

