一、引言
在做时序数据相关任务时候,会遇到采样的间隔不规律的情况,比如采样周期为月,但是有的月份应该种种原因未能成功采样,如下:
这时候运用统计模型进行时序分析的时候往往会出现问题,所以我们需要构造规律的时间间隔,然后对构造出的月份的数据进行插值。
二、实现过程
方法一:先构造、后填充
代码:
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、数据分析、特征工程、机器学习、深度学习、人工智能系列基础知识与案例。致力于只做原创,以最简单的方式理解和学习,关注gzh:数据杂坛,获取数据和源码学习更多内容。
原文链接: