使用 pandas 插值将每月值转换为每日值

lsr*_*729 4 python interpolation pandas

我有 1000 列的 12 个平均每月值,我想使用 pandas 将数据转换为每日数据。我尝试使用插值来完成此操作,但我得到了从 1991 年 1 月 31 日到 1991 年 12 月 31 日的每日值,这并不涵盖全年。一月份的值没有得到。我使用date_range作为数据框的索引。

date=pd.date_range(start="01/01/1991",end="31/12/1991",freq="M")

upsampled=df.resample("D")
interpolated = upsampled.interpolate(method='linear')
Run Code Online (Sandbox Code Playgroud)

如何获得 365 天的插值?

Val*_*_Bo 9

请注意,插值介于在已知点

\n\n

因此,要在全年中进行插值,仅拥有\n12值(每个月)是不够的。\n您必须拥有13 个值(例如,每个月的开始\n下一年的开始)。

\n\n

因此我创建了源df创建为:

\n\n
date = pd.date_range(start='01/01/1991', periods=13, freq='MS')\ndf = pd.DataFrame({'date': date, 'amount': np.random.randint(100, 200, date.size)})\n
Run Code Online (Sandbox Code Playgroud)\n\n

得到例如:

\n\n
         date  amount\n0  1991-01-01     113\n1  1991-02-01     164\n2  1991-03-01     181\n3  1991-04-01     164\n4  1991-05-01     155\n5  1991-06-01     157\n6  1991-07-01     118\n7  1991-08-01     133\n8  1991-09-01     184\n9  1991-10-01     183\n10 1991-11-01     159\n11 1991-12-01     193\n12 1992-01-01     163\n
Run Code Online (Sandbox Code Playgroud)\n\n

\xe2\x80\x8b然后将其上采样到每日频率并进行插值,我运行:

\n\n
df.set_index('date').resample('D').interpolate()\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果您不希望结果包含最后一行(对于1992-01-01),\n仅取上述结果的一部分,删除最后一行:

\n\n
df.set_index('date').resample('D').interpolate()[:-1]\n
Run Code Online (Sandbox Code Playgroud)\n