一、引言
在做时序数据相关任务时候,会遇到采样的间隔不规律的情况,比如采样周期为月,但是有的月份应该种种原因未能成功采样,如下:
这时候运用统计模型进行时序分析的时候往往会出现问题,所以我们需要构造规律的时间间隔,然后对构造出的月份的数据进行插值。
二、实现过程
方法一:先构造、后填充
代码:
import pandas as pd
# 创建一个包含不规律时间间隔的DataFrame对象
df = pd.DataFrame({'time': ['2013-01-01', '2013-02-01', '2013-04-01', '2013-06-01', '2013-07-01'],'value': [2, 4, 5, 7, 9]
})# 将时间列转换为 pandas 的日期时间类型
df['time'] = pd.to_datetime(df['time'])
# 将日期列设置为索引
df.set_index('time', inplace=True)
# 构造规律的时间间隔
df = df.resample('MS').asfreq()
print(df)# 使用插值法填充缺失值
df['value'] = df['value'].interpolate()
interpolated_df = df# 输出结果
print(interpolated_df)
首先将不规律的时间点和对应的数值存储在一个 pandas 的 DataFrame 对象中。然后,我们将时间列转换为 pandas 的日期时间类型,以便后续处理。接下来,使用resample
方法将时间序列转换为规律的时间间隔(月份),并使用asfreq
方法将缺失的月份填充为 NaN 值。最后,我们使用interpolate
方法对数值列进行插值操作,填补缺失的数值。
结果:
方法二:先填充、后构造
代码:
import pandas as pd
from scipy.interpolate import interp1d# 创建一个包含不规律时间间隔的DataFrame对象
df = pd.DataFrame({'time': ['2013-01-01', '2013-02-01', '2013-04-01', '2013-06-01', '2013-07-01'],'value': [2, 4, 5, 7, 9]
})# 将时间列转换为 pandas 的日期时间类型
df['time'] = pd.to_datetime(df['time'])# 构造规律的时间间隔
start_time = df['time'].min()
end_time = df['time'].max()
regular_time = pd.date_range(start=start_time, end=end_time, freq='MS')# 使用 interp1d 函数对规律时间间隔进行插值操作
# interp1d(df['time'].values.astype(float), df['value'].values)返回一个函数
interpolated_values = interp1d(df['time'].values.astype(float), df['value'].values)(regular_time.values.astype(float))# 创建包含插值结果的DataFrame对象
interpolated_df = pd.DataFrame({'time': regular_time, 'value': interpolated_values})# 输出结果
print(interpolated_df)
先基于原数据构造出构造规律的时间间隔,然后基于原数据使用 interp1d 函数对构造出的规律时间间隔进行插值操作,最终创建出新的规律的时间间隔的数据。
结果:
作者简介:
读研期间发表6篇SCI数据挖掘相关论文,现在某研究院从事数据算法相关科研工作,结合自身科研实践经历不定期分享关于Python、机器学习、深度学习、人工智能系列基础知识与应用案例。致力于只做原创,以最简单的方式理解和学习,关注我一起交流成长。需要数据集和源码的小伙伴可以关注底部公众号添加作者微信。