使用Pandas将月度数据线性插值为日度/周度数据
把月度Pandas DataFrame转换为日度/周度线性插值数据
嘿,这个需求我熟,用Pandas的日期处理和插值功能就能完美解决,咱们一步步来,保证你能轻松实现:
第一步:准备并转换原始数据
首先,咱们先把你给出的月度数据转换成Pandas能识别的日期格式,同时调整数据结构方便后续处理:
import pandas as pd # 先模拟你的原始DataFrame(如果已经有了可以跳过这部分) data = { '201301': [0.747711, 0.776537, 0.801699, 0.797942, 0.777472, 0.780933, 2.071699], '201302': [0.793101, 0.759745, 0.847655, 0.687899, 0.799676, 0.750774, 2.261739], '201303': [0.771819, 0.733673, 0.796586, 0.729911, 0.782947, 0.781056, 2.126915], '201709': [0.818161, 0.757496, 0.784537, 0.819887, 0.804533, 0.790846, 1.891780], '201710': [0.812522, 0.765181, 0.763551, 0.772395, 0.791759, 0.773705, 2.098914] } df = pd.DataFrame(data, index=['a', 'b', 'c', 'd', 'e', 'f', 'g']) # 把列名的yyyymm字符串转成日期格式(这里有两种选择) # 选择1:对应**月初**日期(和你示例中的计算逻辑一致,间隔是自然月天数) df.columns = pd.to_datetime(df.columns, format='%Y%m') # 选择2:对应**月末**日期(更贴合月度统计数据的常规锚点) # df.columns = pd.to_datetime(df.columns, format='%Y%m') + pd.offsets.MonthEnd(0) # 转置DataFrame:让日期成为行索引,变量(a-g)作为列,方便时间维度的插值 df_transposed = df.T
第二步:生成日度线性插值数据
现在我们可以基于转置后的月度数据,生成完整的日度序列并做线性插值:
# 生成从第一个月度日期到最后一个月度日期的所有日度索引 daily_index = pd.date_range(start=df_transposed.index[0], end=df_transposed.index[-1], freq='D') # 重新索引到日度,并用线性插值填充所有缺失的日度数据 daily_df = df_transposed.reindex(daily_index).interpolate(method='linear') # 如果需要把变量(a-g)变回行索引(和原始格式一致),可以再转置回去 # daily_df = daily_df.T
这一步的插值逻辑和你示例中的计算完全一致:比如2013年1月到2月的日度增量,就是(2月值 - 1月值)/两个月之间的天数,Pandas会自动根据日期间隔计算线性增量,无需手动计算。
第三步:生成周度线性插值数据
周度数据有两种生成方式,你可以根据需求选择:
方式1:直接从月度数据插值到周度
# 生成周度数据,默认以每周日作为周结束(可以用freq='W-MON'改成周一结束) weekly_df = df_transposed.resample('W').interpolate(method='linear')
方式2:从日度数据聚合到周度
如果你已经生成了日度数据,也可以直接聚合到周度(比如取每周最后一天的值):
# 取每周最后一天的日度插值结果作为周度数据 weekly_df = daily_df.resample('W').last() # 或者取每周的均值:weekly_df = daily_df.resample('W').mean()
验证结果
你可以查看生成的日度/周度数据,比如查看2013年1月的前几天:
print(daily_df.loc['2013-01-01':'2013-01-03', 'a'])
输出会是从1月初始值开始,每天按线性增量递增的结果,和你手动计算的完全匹配。
内容的提问来源于stack exchange,提问作者EJ Kang
相关产品推荐
相关产品推荐

