Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 熊猫用新的时间尺度插值_Python_Datetime_Pandas_Interpolation - Fatal编程技术网

Python 熊猫用新的时间尺度插值

Python 熊猫用新的时间尺度插值,python,datetime,pandas,interpolation,Python,Datetime,Pandas,Interpolation,我有一个时间序列,在事件发生的任何时候都会记录时间戳(因此没有给定的频率)。时间戳的精度为毫秒。 随着数千行和许多变量的进行,我想创建一个具有给定频率(此处为“5ms”)的新时间范围,并在这些时间内插值。所以我试了一下: import pandas as pd a = pd.DataFrame({"Time":pd.to_datetime(['2016-01-23 00:00:00.001', '2016-01-23 00:00:00.013','2016-01-23 00:00:00.018

我有一个时间序列,在事件发生的任何时候都会记录时间戳(因此没有给定的频率)。时间戳的精度为毫秒。 随着数千行和许多变量的进行,我想创建一个具有给定频率(此处为“5ms”)的新时间范围,并在这些时间内插值。所以我试了一下:

import pandas as pd

a = pd.DataFrame({"Time":pd.to_datetime(['2016-01-23 00:00:00.001',
'2016-01-23 00:00:00.013','2016-01-23 00:00:00.018',
'2016-01-23 00:00:00.024']),
"Value": [1,2,3,4]})

a = a.set_index(a["Time"])
b = pd.date_range(start='2016-01-23 00:00:00.00',
  end='2016-01-23 00:00:00.025', freq='5ms')
c = a.reindex(b).interpolate(method="time")
>>                        Time  Value
  2016-01-23 00:00:00.000  NaT    NaN
  2016-01-23 00:00:00.005  NaT    NaN
  2016-01-23 00:00:00.010  NaT    NaN
  2016-01-23 00:00:00.015  NaT    NaN
  2016-01-23 00:00:00.020  NaT    NaN
  2016-01-23 00:00:00.025  NaT    NaN
d=a.resample('5ms').interpolate()
>>                        Time  Value                             
  2016-01-23 00:00:00.000  NaT    NaN
  2016-01-23 00:00:00.005  NaT    NaN
  2016-01-23 00:00:00.010  NaT    NaN
  2016-01-23 00:00:00.015  NaT    NaN
  2016-01-23 00:00:00.020  NaT    NaN
我想,如果新的时间尺度不包含以前的时间戳,那么这些解决方案都无法工作?我最终解决了这个问题,如下所示:

e = a.reindex(a.index.union(b)).interpolate(method='time').reindex(b)
>>                        Time     Value
  2016-01-23 00:00:00.000  NaT       NaN
  2016-01-23 00:00:00.005  NaT  1.333333
  2016-01-23 00:00:00.010  NaT  1.749995
  2016-01-23 00:00:00.015  NaT  2.400031
  2016-01-23 00:00:00.020  NaT  3.333348
  2016-01-23 00:00:00.025  NaT  4.000000

但这看起来很重,对我来说效率不高。我本来希望通过插值函数可以直接实现这一点。有什么想法吗?

如果在索引上设置时间,可以使用重采样

a = pd.DataFrame({"Time":pd.to_datetime(['2016-01-23 00:00:00.001',
   '2016-01-23 00:00:00.013','2016-01-23 00:00:00.018',
   '2016-01-23 00:00:00.024']),
   "Value": [1,2,3,4]})

a.set_index('Time', inplace=True)    

print(a.resample('1ms').interpolate().resample('5ms').first())
输出:

                        Value
Time                             
2016-01-23 00:00:00.000  1.000000
2016-01-23 00:00:00.005  1.333333
2016-01-23 00:00:00.010  1.750000
2016-01-23 00:00:00.015  2.400000
2016-01-23 00:00:00.020  3.333333
还是有点变通。但这是很重要的

直接重采样到5微秒会产生更粗的插值:

print(a.resample('5ms').first().interpolate())

                         Value
Time                          
2016-01-23 00:00:00.000    1.0
2016-01-23 00:00:00.005    1.5
2016-01-23 00:00:00.010    2.0
2016-01-23 00:00:00.015    3.0
2016-01-23 00:00:00.020    4.0

谢谢你的回答,它确实有效,但看起来确实和我的解决方案一样有解决办法。我想知道是否有可能直接在一个新的时间索引上插值,而不必在一行中重新索引或重新采样两次。在我的案例研究中,我有几千行和一些变量,我想线性插值,一些我只想“ffill”,另一些我只想得到最近的值。对于所有这些情况,必须进行2次重新索引+填充操作需要很长的计算时间!您可以使用:a.resample('5ms').interpolate()直接插值一次,但结果是非常粗糙的插值。您指的不是我在示例中称为变量“d”的东西吗?它在这里不起作用。不知道为什么它对你不起作用。对我来说,这是一个答案。我会在其他输出下发布。谢谢。仅供参考,我正在运行熊猫0.19.1。我还在让NaN运行你的代码