如何对时间序列数据进行重新采样和插值 (三次样条插值)

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
@Grayrigel 的想法是从第一个日期开始,每隔3个月移动一次。 - MBu
我理解。但是,如果在3个月的时间段内有多个“因素”条目,那么您想要对它们进行求和、平均值或计数怎么办?请检查我的答案。 - Grayrigel
1个回答

2

试试这个:

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()。是否可以从原始日期开始而不是月末? - MBu
@user3087494 我已经更新了我的答案。请检查它是否适用于您。 - Grayrigel
@Grairiegel,感谢您的帮助,但最后一个挑战是将开始日期与原始日期对齐。现在它是月初。有什么想法将不胜感激。 - MBu
谢谢@Grayrigel,这也是我想的。现在这是一个解决方案。这种解决方案的缺点是,在90天内我们不能将一年平均分成四个季度,这在长期看来更为明显。现在应该没问题了,但如果您有其他更好的解决方案,那就更好了。感谢您的帮助! - MBu
@Graygiel,另一种方法可能是生成一个新的数据框,其中包含固定间隔为3M的时间序列,然后使用原始数据框中的插值值更新新列。这种方法可行吗? - MBu
@MBu 我已经用 loffset 更新了我的答案。当然,那是可以做到的。不过,我认为那和 offset 是一样的。 - Grayrigel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接