Python 如果月值=年,如何从月到年再到月重新采样?

Python 如果月值=年,如何从月到年再到月重新采样?,python,pandas,matplotlib,Python,Pandas,Matplotlib,我有一个每月的时间序列,我已经用 ts_ann =ts_mo['Value'].resample('A').mean() 我接下来要做的是创建一个新的时间序列,其中每月值等于每年值。这样,我可以绘制月度图表,突出显示年度平均值,但也可以显示月度频率。没有太多的运气寻找解决方案。谢谢您可以在索引上对两个数据帧进行左外合并。这将生成一个数据框,其中在1月至11月的年度列中包含NaN,以及Dezember的实际年度平均值。 然后使用pandasfillna方法向后填充NaN值: ts_mo.merg

我有一个每月的时间序列,我已经用

ts_ann =ts_mo['Value'].resample('A').mean()

我接下来要做的是创建一个新的时间序列,其中每月值等于每年值。这样,我可以绘制月度图表,突出显示年度平均值,但也可以显示月度频率。没有太多的运气寻找解决方案。谢谢

您可以在索引上对两个数据帧进行左外合并。这将生成一个数据框,其中在1月至11月的年度列中包含
NaN
,以及Dezember的实际年度平均值。 然后使用pandas
fillna
方法向后填充
NaN
值:

ts_mo.merge(ts_ann, left_index=True, right_index=True, how='left').fillna(method='bfill')

通过在
merge
调用中指定
后缀=(“'u monthly','u yearly'u average')
,可以为结果列指定有意义的名称。

可以使用groupby和transform获得年平均值。将其指定给一个新列,即可进行绘图

ts_mo['Year_mean'] = ts_mo.groupby(ts_mo.index.year)['Value'].transform('mean')
完整示例:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

np.random.seed(400)

ts_mo = pd.DataFrame({
    'date': pd.date_range(start='2016',end='2018', freq='M'),
    'Value': np.random.randint(0,100, size=24)
}).set_index('date')

ts_mo['Year_mean'] = ts_mo.groupby(ts_mo.index.year)['Value'].transform('mean')

ts_mo.plot(x=ts_mo.index, y=['Value','Year_mean'])
plt.show()
返回:


谢谢。我试过并收到了以下消息。。。ValueError:无法将DataFrame与类型为的实例合并我想我知道为什么会出现此错误,但我是python新手,因此不确定解决方案!输入:键入(ts_-ann)输出:pandas.core.series.series和输入:键入(ts_-mo)输出:pandas.core.frame.DataFrame您的年度数据似乎是一个系列,而不是一个数据框。也许您应该使用:ts_ann=ts_mo[['Value']]].resample('A').mean(),它从ts_mo创建一个子数据帧,而不是仅使用一个围绕“Value”的参数来创建一个序列。这有用吗?