2

我正在使用 datetime 索引在 pandas 数据框中寻找 6 小时的间隔,我想在间隔之后使用类似这样的列表理解创建一个包含 datetime 对象的列表:

starttimes = [x for i, x in enumerate(data.index) if ((x - x[i-1]).seconds/3600.0) > 6 ]

但我收到以下类型错误:

TypeError: 'Timestamp' object does not support indexing

错误发生在枚举(data.index)之后,但我不确定为什么会收到此错误,因为我可以这样做:

(data.index[0] - data.index[1]).seconds/3600.0 > 6

很好,输出是真的。

我也尝试过这种方式并得到了不同的类型错误:

starttime = [x for i, x in enumerate(WaterTest) if ((x.index - x.index[i-1]).seconds/3600.0) > 6 ]

TypeError: 'builtin_function_or_method' object has no attribute '__getitem__'

有没有办法轻松做到这一点?我必须在我的代码中经常使用这样的语句,并且能够以类似于此的方式编写它们会很好。

4

1 回答 1

3

在迭代时,DatetimeIndex 将其值转换为时间戳

In [26]: index = pd.DatetimeIndex(['20130101 12:00:00','20130101 18:01:01','20130102 9:00:00','20130102 23:00:05'])

In [27]: index
Out[27]: 
<class 'pandas.tseries.index.DatetimeIndex'>
[2013-01-01 12:00:00, ..., 2013-01-02 23:00:05]
Length: 4, Freq: None, Timezone: None

In [28]: for x in index:
   ....:     print type(x)
   ....:     
<class 'pandas.tslib.Timestamp'>
<class 'pandas.tslib.Timestamp'>
<class 'pandas.tslib.Timestamp'>
<class 'pandas.tslib.Timestamp'>

但是有一种更简单的方法来做你正在做的事情

时间 - shift_time = timedelta

In [29]: td = index.to_series().diff()

In [30]: td
Out[30]: 
2013-01-01 12:00:00        NaT
2013-01-01 18:01:01   06:01:01
2013-01-02 09:00:00   14:58:59
2013-01-02 23:00:05   14:00:05
dtype: timedelta64[ns]

这在 numpy >= 1.7 中有效(请参阅此处了解您可以执行的其他操作以及如果 numpy < 1.7 时该怎么办): http: //pandas.pydata.org/pandas-docs/dev/timeseries.html#time -三角洲

以 6 小时为单位的差速器

In [31]: td.apply(lambda x: x/np.timedelta64(6,'h'))
Out[31]: 
2013-01-01 12:00:00         NaN
2013-01-01 18:01:01    1.002824
2013-01-02 09:00:00    2.497176
2013-01-02 23:00:05    2.333565
dtype: float64
于 2013-07-26T19:20:40.393 回答