Python pandas 时间序列插值和正则化
Python pandas time series interpolation and regularization
我是第一次使用 Python Pandas。我有 5 分钟的 csv 格式滞后流量数据:
...
2015-01-04 08:29:05,271238
2015-01-04 08:34:05,329285
2015-01-04 08:39:05,-1
2015-01-04 08:44:05,260260
2015-01-04 08:49:05,263711
...
有几个问题:
- 某些时间戳缺少数据 (-1)
- 缺少条目(也是连续 2/3 小时)
- 观察的频率不是恰好5分钟,而是偶尔会少几秒
我想获得一个规律的时间序列,所以每(恰好)5 分钟输入一次(并且没有遗漏值)。我已经成功地使用以下代码对时间序列进行了插值,以使用此代码近似于 -1 值:
ts = pd.TimeSeries(values, index=timestamps)
ts.interpolate(method='cubic', downcast='infer')
如何对观察的频率进行插值和正则化?谢谢大家的帮助。
将 -1
更改为 NaN:
ts[ts==-1] = np.nan
然后以 5 分钟的频率对数据重新采样。
ts = ts.resample('5T')
请注意,默认情况下,如果两个测量值落在相同的 5 分钟内,resample
会对这些值求平均值。
最后,你可以根据时间对时间序列进行线性插值:
ts = ts.interpolate(method='time')
因为看起来你的数据已经有大约 5 分钟的频率,你
可能需要以较短的频率重新采样,以便三次或样条插值
可以平滑曲线:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
values = [271238, 329285, -1, 260260, 263711]
timestamps = pd.to_datetime(['2015-01-04 08:29:05',
'2015-01-04 08:34:05',
'2015-01-04 08:39:05',
'2015-01-04 08:44:05',
'2015-01-04 08:49:05'])
ts = pd.Series(values, index=timestamps)
ts[ts==-1] = np.nan
ts = ts.resample('T').mean()
ts.interpolate(method='spline', order=3).plot()
ts.interpolate(method='time').plot()
lines, labels = plt.gca().get_legend_handles_labels()
labels = ['spline', 'time']
plt.legend(lines, labels, loc='best')
plt.show()
我是第一次使用 Python Pandas。我有 5 分钟的 csv 格式滞后流量数据:
...
2015-01-04 08:29:05,271238
2015-01-04 08:34:05,329285
2015-01-04 08:39:05,-1
2015-01-04 08:44:05,260260
2015-01-04 08:49:05,263711
...
有几个问题:
- 某些时间戳缺少数据 (-1)
- 缺少条目(也是连续 2/3 小时)
- 观察的频率不是恰好5分钟,而是偶尔会少几秒
我想获得一个规律的时间序列,所以每(恰好)5 分钟输入一次(并且没有遗漏值)。我已经成功地使用以下代码对时间序列进行了插值,以使用此代码近似于 -1 值:
ts = pd.TimeSeries(values, index=timestamps)
ts.interpolate(method='cubic', downcast='infer')
如何对观察的频率进行插值和正则化?谢谢大家的帮助。
将 -1
更改为 NaN:
ts[ts==-1] = np.nan
然后以 5 分钟的频率对数据重新采样。
ts = ts.resample('5T')
请注意,默认情况下,如果两个测量值落在相同的 5 分钟内,resample
会对这些值求平均值。
最后,你可以根据时间对时间序列进行线性插值:
ts = ts.interpolate(method='time')
因为看起来你的数据已经有大约 5 分钟的频率,你 可能需要以较短的频率重新采样,以便三次或样条插值 可以平滑曲线:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
values = [271238, 329285, -1, 260260, 263711]
timestamps = pd.to_datetime(['2015-01-04 08:29:05',
'2015-01-04 08:34:05',
'2015-01-04 08:39:05',
'2015-01-04 08:44:05',
'2015-01-04 08:49:05'])
ts = pd.Series(values, index=timestamps)
ts[ts==-1] = np.nan
ts = ts.resample('T').mean()
ts.interpolate(method='spline', order=3).plot()
ts.interpolate(method='time').plot()
lines, labels = plt.gca().get_legend_handles_labels()
labels = ['spline', 'time']
plt.legend(lines, labels, loc='best')
plt.show()