5

我有一个这样的pandas.core.series.TimeSeries名字ts

timestamp
2013-08-11 14:23:50        0.3219
2013-08-11 14:23:49        0.3222
2013-08-11 14:19:14        0.3305
2013-08-11 00:47:15        0.3400
2013-08-11 00:47:15.001    0.3310
2013-08-11 00:47:15.002    0.3310
2013-08-10 22:38:15.003    0.3400
2013-08-10 22:38:14        0.3403
2013-08-10 22:38:13        0.3410

此 TimeSerie 的索引是不规则间隔的。

我想ts为给定的日期时间设置值,例如2013-08-11 14:20:00

我只需要插入一个值,而不是整个 TimeSerie

我只想在前一个索引 ( 2013-08-11 14:23:49) 和下一个索引 ( 2013-08-11 14:19:14)之间使用线性函数插入数据

4

2 回答 2

7

谢谢你丹艾伦。恐怕我没有评论的声誉,但如果要求对 ts 索引中已定义的时间进行插值,Dan Allan 的插值函数会引发异常。例如

s = pd.to_datetime('2015-08-26 00:00:00')
e = pd.to_datetime('2015-08-26 00:10:00')
ts=pd.Series([0,8000],index=[s,e])
interpolate(ts,pd.to_datetime('2015-08-26 00:00:00'))

我对上面的小修改是:

def interpolate(ts, target):
    if target in ts.index:
        return ts[target]
    ts1 = ts.sort_index()
    b = (ts1.index > target).argmax() # index of first entry after target
    s = ts1.iloc[b-1:b+1]
    # Insert empty value at target time.
    s = s.reindex(pd.to_datetime(list(s.index.values) + [pd.to_datetime(target)]))
    return s.interpolate(method='time').loc[target]
于 2015-08-26T13:41:39.310 回答
6

选取系列的一个子集,仅包括目标上方和下方的条目。然后使用interpolate.

def interpolate(ts, target):
    ts1 = ts.sort_index()
    b = (ts1.index > target).argmax() # index of first entry after target
    s = ts1.iloc[b-1:b+1]
    # Insert empty value at target time.
    s = s.reindex(pd.to_datetime(list(s.index.values) + [pd.to_datetime(target)]))
    return s.interpolate('time').loc[target]

例子:

interpolate(ts, '2013-08-11 14:20:00')
2013-08-11 14:20:00    0.329112
于 2013-08-12T15:37:02.660 回答