【问题标题】:How to resample and interpolate (cubic spline) timeseries data如何重新采样和插值(三次样条)时间序列数据
【发布时间】:2021-01-02 04:48:50
【问题描述】:

我需要将时间序列重新采样到固定间隔,例如。 3个月,同时用三次样条法插值。 什么是最有效的方法? 样本数据:

dates = ('2020-09-24','2020-10-19','2020-12-17','2021-03-17','2021-06-17','2021-09-17','2022-03-17','2022-09-20','2023-09-19','2024-09-17','2025-09-17','2026-09-17','2027-09-17','2028-09-19','2029-09-18','2030-09-17','2031-09-17','2032-09-17','2035-09-18','2040-09-18','2045-09-19')
factors = ('1','0.999994','0.999875','1.000166','1.000303','1.000438','1.00056','1.000817','1.001046','1.001412','1.001525','1.001334','1.000685','0.999376','0.997456','0.994626','0.991244','0.986754','0.982072','0.962028','0.925136')
df = pd.DataFrame()
df['dates']=dates
df['factors']=factors

【问题讨论】:

  • 您希望如何重新采样(即summean?)
  • @Grayrigel 的想法是从第一个日期开始,每隔 3 个月移动一次。
  • 我明白这一点。但是,如果您在 3 个月内有多个 factors 条目,那么您想对它们求和,意思是它们,计算它们怎么办?请检查我的答案。

标签: python pandas interpolation resampling


【解决方案1】:

试试这个:

import pandas as pd
from datetime import timedelta

dates = ('2020-09-24','2020-10-19','2020-12-17','2021-03-17','2021-06-17','2021-09-17','2022-03-17','2022-09-20','2023-09-19','2
024-09-17','2025-09-17','2026-09-17','2027-09-17','2028-09-19','2029-09-18','2030-09-17','2031-09-17','2032-09-17','2035-09-18',
'2040-09-18','2045-09-19')
factors = ('1','0.999994','0.999875','1.000166','1.000303','1.000438','1.00056','1.000817','1.001046','1.001412','1.001525','1.0
01334','1.000685','0.999376','0.997456','0.994626','0.991244','0.986754','0.982072','0.962028','0.925136')
df = pd.DataFrame()
df['dates']=dates
df['factors']=factors


df = pd.DataFrame()
df['dates']=dates
df['factors']=factors

df['dates'] = pd.to_datetime(df['dates'])
df.set_index(['dates'],inplace=True)
df['factors']  = df['factors'].astype(float)

df = df.resample('3MS', loffset=timedelta(days=df.index[0].day - 1 )).mean().interpolate(method='cubic')
print(df)

输出:

dates               
2020-09-24  0.999997
2020-12-24  0.999875
2021-03-24  1.000166
2021-06-24  1.000303
2021-09-24  1.000438
...              ...
2044-09-24  0.933154
2044-12-24  0.931170
2045-03-24  0.929196
2045-06-24  0.927170
2045-09-24  0.925136

【讨论】:

  • 谢谢@Grayriegel,我已更改为mean()。是否可以从原始日期开始而不是月底?
  • @user3087494 我已经更新了我的答案。请检查它是否适合您。
  • @Grairiegel,谢谢你,但最后一个挑战是将开始日期与原始日期对齐。现在是月初。任何想法都非常感谢
  • 谢谢@Grayrigel,这也是我的想法。现在它必须是一个解决方案。该解决方案的不利之处在于,使用 90D 时,我们无法将一年平均分成几个季度,这在长期来看更为明显。现在应该没问题,但是如果您有任何其他解决方案会更好。感谢您的帮助!
  • @Graygiel,另一种方法是生成一个具有固定间隔为 3M 的时间序列的新数据帧,然后使用原始数据帧的插值更新新列?这可能吗?跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-10-20
  • 1970-01-01
  • 2020-12-28
  • 2014-12-15
  • 1970-01-01
  • 2014-02-28
  • 2012-01-30
相关资源
最近更新 更多