end*_*ith 6 python interpolation pandas
从此示例修改:
import io
import pandas as pd
import matplotlib.pyplot as plt
data = io.StringIO('''\
Values
1992-08-27 07:46:48,1
1992-08-27 08:00:48,2
1992-08-27 08:33:48,4
1992-08-27 08:43:48,3
1992-08-27 08:48:48,1
1992-08-27 08:51:48,5
1992-08-27 08:53:48,4
1992-08-27 08:56:48,2
1992-08-27 09:03:48,1
''')
s = pd.read_csv(data, squeeze=True)
s.index = pd.to_datetime(s.index)
res = s.resample('4s').interpolate('linear')
print(res)
plt.plot(res, '.-')
plt.plot(s, 'o')
plt.grid(True)
Run Code Online (Sandbox Code Playgroud)
它按预期工作:
1992-08-27 07:46:48 1.000000
1992-08-27 07:46:52 1.004762
1992-08-27 07:46:56 1.009524
1992-08-27 07:47:00 1.014286
1992-08-27 07:47:04 1.019048
1992-08-27 07:47:08 1.023810
1992-08-27 07:47:12 1.028571
....
Run Code Online (Sandbox Code Playgroud)
但如果我将重新采样更改为'5s'
,它只生成NaN:
1992-08-27 07:46:45 NaN
1992-08-27 07:46:50 NaN
1992-08-27 07:46:55 NaN
1992-08-27 07:47:00 NaN
1992-08-27 07:47:05 NaN
1992-08-27 07:47:10 NaN
1992-08-27 07:47:15 NaN
....
Run Code Online (Sandbox Code Playgroud)
为什么?
piR*_*red 13
选项1
这是因为'4s'
与您现有的索引完全一致.当你resample
,你从旧系列中获得代表并且能够进行插值.您要做的是创建一个索引,它是旧索引与新索引的并集.然后使用新索引进行插值和重新索引.
oidx = s.index
nidx = pd.date_range(oidx.min(), oidx.max(), freq='5s')
res = s.reindex(oidx.union(nidx)).interpolate('index').reindex(nidx)
res.plot(style='.-')
s.plot(style='o')
Run Code Online (Sandbox Code Playgroud)
选项2A
如果您愿意放弃准确性,您可以ffill
限制1
res = s.resample('5s').ffill(limit=1).interpolate()
res.plot(style='.-')
s.plot(style='o')
Run Code Online (Sandbox Code Playgroud)
选项2B
同样的事情bfill
res = s.resample('5s').bfill(limit=1).interpolate()
res.plot(style='.-')
s.plot(style='o')
Run Code Online (Sandbox Code Playgroud)
选项3
中间复杂性和准确性
nidx = pd.date_range(oidx.min(), oidx.max(), freq='5s')
res = s.reindex(nidx, method='nearest', limit=1).interpolate()
res.plot(style='.-')
s.plot(style='o')
Run Code Online (Sandbox Code Playgroud)