熊猫时间序列索引 - 重新

时间:2014-02-13 23:42:45

标签: python pandas time-series

我有一个按时间索引的pandas数据框:

>>> dframe.head()
                     aw_FATFREEMASS raw aw_FATFREEMASS sym
TIMESTAMP
2011-12-08 23:13:23               139.3                  H
2011-12-08 23:12:18               139.2                  H
2011-12-08 22:31:53               139.2                  H
2011-12-09 07:08:50               138.2                  H
2011-12-10 21:36:20               137.6                  H

[5 rows x 2 columns]

>>> type(dframe.index)
<class 'pandas.tseries.index.DatetimeIndex'>

我正在尝试执行类似于此SQL的简单时间序列查询:

SELECT * FROM dframe WHERE tstart <= TIMESTAMP <= tend

其中tstart和tend适当地表示时间戳。有了熊猫,我得到的行为我只是不明白。

这符合我的期望:

>>> dframe['2011-11-01' : '2011-11-20']
Empty DataFrame
Columns: [aw_FATFREEMASS raw, aw_FATFREEMASS sym]
Index: []
[0 rows x 2 columns]

这也是一样的事情:

dframe['2011-11-01 00:00:00' : '2011-11-20 00:00:00']

然而:

>>> from dateutil.parser import parse
>>> dframe[parse('2011-11-01 00:00:00') : '2011-11-20 00:00:00']
*** TypeError: 'datetime.datetime' object is not iterable
>>> dframe[parse('2011-11-01') : '2011-11-20 00:00:00']
*** TypeError: 'datetime.datetime' object is not iterable
>>> dframe[parse('2011-11-01') : parse('2011-11-01')]
*** KeyError: Timestamp('2011-11-01 00:00:00', tz=None)

当我提供一个表示为熊猫时间戳的时间时,我得到切片行为,我不明白。有人可以解释这种行为和/或告诉我如何实现上面的SQL查询吗?

1 个答案:

答案 0 :(得分:3)

文档是here

这称为部分字符串索引。简而言之,提供字符串可以获得“匹配”的结果,例如它们包含在指定的时间间隔内,而如果指定时间戳/日期时间,则其确切;它必须在索引中。

你能说明你是如何构建DatetimeIndex的吗?

什么版本的熊猫?

In [4]: df = DataFrame(np.random.randn(20,2),index=date_range('20130101',periods=20,freq='H'))

In [5]: df
Out[5]: 
                            0         1
2013-01-01 00:00:00 -0.339751  1.223660
2013-01-01 01:00:00  0.525203 -0.987815
2013-01-01 02:00:00  1.724239  0.213446
2013-01-01 03:00:00 -0.074797 -1.658876
2013-01-01 04:00:00  0.483425 -2.112314
2013-01-01 05:00:00  0.094140  0.327681
2013-01-01 06:00:00 -1.265337 -0.858521
2013-01-01 07:00:00 -1.470041  0.168871
2013-01-01 08:00:00 -0.609185  0.829035
2013-01-01 09:00:00  0.047774  0.221399
2013-01-01 10:00:00  0.814162 -1.415824
2013-01-01 11:00:00  1.070209  0.720150
2013-01-01 12:00:00  0.887571 -0.611207
2013-01-01 13:00:00  1.669451 -0.022434
2013-01-01 14:00:00 -1.796565 -1.186899
2013-01-01 15:00:00  0.417758  0.082021
2013-01-01 16:00:00 -1.064019 -0.377208
2013-01-01 17:00:00  0.939902  0.430784
2013-01-01 18:00:00 -0.645667  1.611992
2013-01-01 19:00:00 -0.172148 -1.725041

[20 rows x 2 columns]

In [6]: df['20130101 7:00:01':'20130101 10:00:00']
Out[6]: 
                            0         1
2013-01-01 08:00:00 -0.609185  0.829035
2013-01-01 09:00:00  0.047774  0.221399
2013-01-01 10:00:00  0.814162 -1.415824

[3 rows x 2 columns]

In [7]: df.index
Out[7]: 
<class 'pandas.tseries.index.DatetimeIndex'>
[2013-01-01 00:00:00, ..., 2013-01-01 19:00:00]
Length: 20, Freq: H, Timezone: None

如果您已经有Timestamps / datetimes,那么只需构造一个布尔表达式

df[(df.index > Timestamp('20130101 10:00:00')) & (df.index < Timestamp('201301010 17:00:00')])