python - 如何使用 Python 将每个月的常数乘以原始时间序列

标签 python pandas numpy time-series

我正在使用 python 查看每月的气候数据。基本上,我计算了每个月的观测值和模拟值的平均值。我正在“标准化”或将整个模拟时间序列乘以 1964-2013 年观察/模拟的比率(每个月 1 个值)。如何在整个时间序列中将每个月的常数乘以相应的月份?

观测数据集

Date           Obs   
1964-01-01  2.362798
1964-02-01  2.581734
1964-03-01  1.978354
1964-04-01  1.297320
1964-05-01  2.419230
1964-06-01  1.792333
1964-07-01  1.241412
1964-08-01  1.738074
1964-09-01  0.232911
1964-10-01 -1.790989
1964-11-01  1.902479
1964-12-01  2.304906
1965-01-01  2.913466
1965-02-01  2.895884
1965-03-01  2.457741
1965-04-01  3.435275
1965-05-01  4.428590
1965-06-01  4.530668
1965-07-01  4.096984
1965-08-01  3.543258
1965-09-01  2.856509
1965-10-01  2.817188
1965-11-01  3.838903
1965-12-01  3.985564
...

模拟数据集

Date            Sim
1964-01-01    4.114642
1964-02-01    4.115002
1964-03-01    4.524121
1964-04-01    4.490407
1964-05-01    4.771731
1964-06-01    5.308645
1964-07-01    4.921411
1964-08-01    4.690133
1964-09-01    4.377383
1964-10-01    4.810576
1964-11-01    4.775757
1964-12-01    4.323243
1965-01-01    4.264359
1965-02-01    4.347614
1965-03-01    4.409341
1965-04-01    4.570921
1965-05-01    5.131675
1965-06-01    4.950372
1965-07-01    4.711410
1965-08-01    4.460363
1965-09-01    4.223364
1965-10-01    4.092056
1965-11-01    4.102400
1965-12-01    3.963300
...

我知道如何使用以下方法找到两个数据集的每月平均值:

    obs_mean=OBS.groupby(OBS.index.strftime("%m")).mean()
    sim_mean=SIM.groupby(OBS.index.strftime("%m")).mean()

然后我可以通过以下方式获得观察/模拟的比率:

    obsarray = np.squeeze(obs_mean.values)
    simarray= np.squeeze(sim_mean.values)
    N_mean=(obsarray)/(simarray)

N_mean 产生以下结果:

[0.74664557 0.75842637 0.72030754 0.68142632 0.68588863 0.56606582
 0.54309691 0.54699926 0.50097214 0.48727185 0.71990437 0.75965146]

如何将每个月的 N_mean 值应用到原始模拟时间序列中的每个相应月份。因此,对于一月 N=0.74664557,我想将该系数乘以模拟时间序列上的每个一月值。另一件需要记住的事情是,该系数基于 50 年基线(1964-2013),我想将该系数应用于更大的模拟时间序列(1950-2100)。在 pandas 框架内这更容易完成吗?任何帮助将不胜感激!

最佳答案

首先使用 groupby 计算比率和mean ,然后使用reindexsim 的所有行中广播结果并相乘。

u = pd.concat([obs, sim], axis=1)
v = u.groupby(u.index.month).mean().eval('Obs / Sim')

sim.mul(v.reindex(obs.index.month).values, axis=0)

关于python - 如何使用 Python 将每个月的常数乘以原始时间序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54296582/

相关文章:

python - 从短信中获取参数

python - 如何比较 2 个列表,其中字符串与备用列表中的元素匹配

python - 无法运行 PyTest-bdd 步骤定义文件,因为它抛出索引超出范围错误

python - 分类变量到多列

python - seaborn.boxplot 和宽格式数据框

python - 如何用相似行的平均列值替换 Pandas 列中的某些值?

python - Python 中的双和

python - 如何使用循环而不是内置函数在 Python 中生成 Toeplitz 矩阵

python - 将数据帧绑定(bind)到 for 循环中的变量会将其转换为元组?

python - 使用 numpy 将棕褐色效果应用于 3D 数组