我有以下格式的 2 个数据帧(df1 和 df2)。
df1 是模拟结果。因此,df1 是更密集的时间步长(每个月的开始)。
df2 是实际观察到的数据。因此可用数据较少(无论何时收集)。
df1 和 df2 都有不同的时间序列(时间步长),并针对每个位置进行编译。
样本数据
df1 = pd.DataFrame({'Date': ['2018-02-01', '2018-03-01', '2018-04-01', '2018-05-01', '2018-06-01', '2018-07-01', '2018-02-01', '2018-03-01', '2018-04-01', '2018-05-01', '2018-06-01', '2018-07-01', '2018-02-01', '2018-03-01', '2018-04-01', '2018-05-01', '2018-06-01', '2018-07-01'], 'Location': [1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3], 'Sim': [3253, 3078, 3222, 3940, 3665, 3856, 3775, 3658, 3056, 3993, 3240, 3054, 3162, 3193, 3627, 3740, 3042, 3569]})
df2 = pd.DataFrame({'Date': ['2018-02-10', '2018-03-18', '2018-04-15', '2018-05-11', '2018-06-12', '2018-07-11', '2018-02-22', '2018-03-31', '2018-04-02', '2018-05-06', '2018-06-30', '2018-07-21', '2018-02-03', '2018-03-04', '2018-04-01', '2018-05-03', '2018-06-05', '2018-07-25'], 'Location': [1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3], 'Observed': [3668, 3102, 3128, 3485, 3926, 3344, 3134, 3258, 3833, 3883, 3122, 3417, 3551, 3971, 3294, 3207, 3803, 3250]})
df1:
Date Location Sim
0 2018-02-01 1 3253
1 2018-03-01 1 3078
2 2018-04-01 1 3222
3 2018-05-01 1 3940
4 2018-06-01 1 3665
5 2018-07-01 1 3856
6 2018-02-01 2 3775
7 2018-03-01 2 3658
8 2018-04-01 2 3056
9 2018-05-01 2 3993
10 2018-06-01 2 3240
11 2018-07-01 2 3054
12 2018-02-01 3 3162
13 2018-03-01 3 3193
14 2018-04-01 3 3627
15 2018-05-01 3 3740
16 2018-06-01 3 3042
17 2018-07-01 3 3569
df2:
Date Location Observed
0 2018-02-10 1 3668
1 2018-03-18 1 3102
2 2018-04-15 1 3128
3 2018-05-11 1 3485
4 2018-06-12 1 3926
5 2018-07-11 1 3344
6 2018-02-22 2 3134
7 2018-03-31 2 3258
8 2018-04-02 2 3833
9 2018-05-06 2 3883
10 2018-06-30 2 3122
11 2018-07-21 2 3417
12 2018-02-03 3 3551
13 2018-03-04 3 3971
14 2018-04-01 3 3294
15 2018-05-03 3 3207
16 2018-06-05 3 3803
17 2018-07-25 3 3250
我正在寻找最终结果作为上面的图片/情节。对于每个“位置”,将“模拟”数据中的日期重新采样为每日频率,然后线性内插或外推(如有必要)。仅在“观察”数据可用的日期计算 Delta (Delta=Observed - Sim)。再次为每个“位置”绘制一个类似于上面附加的图。
我的想法是使用 df.groupby 方法将 df1 中的 Sim 列的每个“位置”、series.resample 分组到每天。线性插值 df1 每日频率。计算 Observed 日期的 Delta。然后将它们绘制出来。
最佳答案
我建议使用 Series 构建单个数据框,然后对其进行插值
Observed= {0: 3668, 1: 3102, 2: 3128, 3: 3485, 4: 3926, 5: 3344, 6: 3134, 7: 3258, 8: 3833, 9: 3883, 10: 3122, 11: 3417, 12: 3551, 13: 3971, 14: 3294, 15: 3207, 16: 3803, 17: 3250}
y1 = pd.Series(Observed, index=Observed)
df = pd.DataFrame({'Date': {0: '2018-02-01', 1: '2018-03-01', 2: '2018-04-01', 3: '2018-05-01', 4: '2018-06-01', 5: '2018-07-01', 6: '2018-02-01', 7: '2018-03-01', 8: '2018-04-01', 9: '2018-05-01', 10: '2018-06-01', 11: '2018-07-01', 12: '2018-02-01', 13: '2018-03-01', 14: '2018-04-01', 15: '2018-05-01', 16: '2018-06-01', 17: '2018-07-01'}, 'Location': {0: 1, 1: 1, 2: 1, 3: 1, 4: 1, 5: 1, 6: 2, 7: 2, 8: 2, 9: 2, 10: 2, 11: 2, 12: 3, 13: 3, 14: 3, 15: 3, 16: 3, 17: 3},
'Sim': {0: 3253, 1: 3078, 2: 3222, 3: 3940, 4: 3665, 5: 3856, 6: 3775, 7: 3658, 8: 3056, 9: 3993, 10: 3240, 11: 3054, 12: 3162, 13: 3193, 14: 3627, 15: 3740, 16: 3042, 17: 3569},
'Observed':Observed})
df.interpolate('index').reindex(Observed)
关于python - 获取具有不同时间序列的两个数据帧之间的差异,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55627865/