从Pandas日期时间索引计算经过的时间差(timedelta)

4

我有一个带datetimeindex的pandas数据框。我想创建一个包含经过时间的列。我是这样计算的:

startTime = df.index[0]
elapsed = df.index - startTime

结果:

TypeError                                 Traceback (most recent call last)
<ipython-input-56-279fd541b1e2> in <module>()
----> 1 df.index - startTime

C:\Python27\lib\site-packages\pandas\tseries\index.pyc in __sub__(self, other)
    612             return self.shift(-other)
    613         else:  # pragma: no cover
--> 614             raise TypeError(other)
    615 
    616     def _add_delta(self, delta):

TypeError: 2014-07-14 14:47:57

奇怪的是,例如:
df.index[1] - startTime

返回:

datetime.timedelta(0, 1)

我认为问题的原因可能是它是一个datetimeindex而不是一个普通的series。然而,当我首先使用df.index作为数据参数创建一个新的series,然后尝试进行减法运算时,会出现大量警告,说我在隐式地将两个不兼容的类型进行转换,并且这在未来将无法工作:

timeStamps =pd.Series(data=df.index)
elapsed = timeStamps - timeStamps[0]

返回值

C:\Python27\lib\site-packages\pandas\core\format.py:1851: DeprecationWarning:     Implicitly casting between incompatible kinds. In a future numpy release, this will raise an error. Use casting="unsafe" if this is intentional.
  elif format_short and x == 0:

虽然我用后一种方法得到了正确的TimeDelta系列,但我不喜欢依赖已弃用的代码。有没有一种“正式”的方法来计算经过的时间?

这是我从csv文件中获取数据的一部分:

Timestamp   Bubbler_Temperature_Setpoint
14-7-2014 14:47:57  13.000000
14-7-2014 14:47:58  13.000000
14-7-2014 14:47:59  13.000000
14-7-2014 14:48:00  13.000000
14-7-2014 14:48:01  13.000000
14-7-2014 14:48:02  13.000000
14-7-2014 14:48:03  13.000000
14-7-2014 14:48:04  13.000000
14-7-2014 14:48:05  13.000000

我使用'read_csv'函数将它读入数据框中:
df = pd.read_csv('test.csv',sep='\t',parse_dates='Timestamp',index_col='Timestamp')

我使用的是 pandas 0.13.1 版本。

请提供一个数据框的示例。 - acushner
展示你的pandas/numpy版本。 - Jeff
我已经编辑了我的问题,并提供了你所请求的信息。 - jkokorian
2个回答

1
我只是改变了 <\p>。
elapsed = df.index - startTime

df['elapsed'] = df.index - startTime

获取时间更改列。这不是你所需要的吗?


1

你实际上正在做这个:

In [30]: ts = Series(13,date_range('20140714 14:47:57',periods=10,freq='s'))

In [31]: ts
Out[31]: 
2014-07-14 14:47:57    13
2014-07-14 14:47:58    13
2014-07-14 14:47:59    13
2014-07-14 14:48:00    13
2014-07-14 14:48:01    13
2014-07-14 14:48:02    13
2014-07-14 14:48:03    13
2014-07-14 14:48:04    13
2014-07-14 14:48:05    13
2014-07-14 14:48:06    13
Freq: S, dtype: int64

# iirc this is available in 0.13.1 (if not, use ``Series(ts.index)``
In [32]: x = ts.index.to_series()

In [33]: x-x.iloc[0]
Out[33]: 
2014-07-14 14:47:57   00:00:00
2014-07-14 14:47:58   00:00:01
2014-07-14 14:47:59   00:00:02
2014-07-14 14:48:00   00:00:03
2014-07-14 14:48:01   00:00:04
2014-07-14 14:48:02   00:00:05
2014-07-14 14:48:03   00:00:06
2014-07-14 14:48:04   00:00:07
2014-07-14 14:48:05   00:00:08
2014-07-14 14:48:06   00:00:09
Freq: S, dtype: timedelta64[ns]

在您的示例中,执行 df.index-df.index[0] 并不是时间差操作,而是一个 SET 操作。请参见这里

非常有用的是知道 (-) 是索引对象上的 SET 运算符!我想我已经被它咬了几次了! - jkokorian
什么会给你一个弃用警告?(我的例子是在0.14.1上)。我不认为这应该给你一个警告(虽然可能已经在0.14.0中修复了一个错误)。 - Jeff
x-x.iloc[0] 命令会出现弃用警告。我尝试升级 pandas,但因为我在 windows 上这有点麻烦。还没有成功... - jkokorian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接