选择由DatetimeIndex索引的Pandas DataFrame的子集以及TimeStamps列表

时间:2012-08-16 16:27:45

标签: python time-series pandas

我有一只大熊猫DataFrame

<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 3425100 entries, 2011-12-01 00:00:00 to 2011-12-31 23:59:59
Data columns:
sig_qual    3425100  non-null values
heave       3425100  non-null values
north       3425099  non-null values
west        3425097  non-null values
dtypes: float64(4)

我使用DataFrame选择.ix[start_datetime:end_datetime]的子集,然后将其传递给peakdetect function,它会在两个单独的列表中返回局部最大值和最小值的索引和值。我提取最大值的索引位置并使用DataFrame.index我得到一个pandas TimeStamps列表。

然后,我尝试通过将TimeStamps列表传递给.ix[]来提取大型DataFrame的相关子集,但它似乎总是返回空DataFrame。我可以遍历TimeStamps列表并从DataFrame获取相关行,但这是一个漫长的过程,我认为ix[]应该接受the docs的值列表? (虽然我看到Pandas 0.7的示例使用了numpy.ndarray的{​​{1}}

更新 下面选择了一个8秒的DataFrame子集,#lines显示了一些值:

numpy.datetime64

更新2:created a gist,实际上是有效的,因为当从csv加载数据时,时间戳的索引列被存储为看似是字符串的numpy对象数组。与索引类型为y = raw_disp['heave'].ix[datetime(2011,12,30,0,0,0):datetime(2011,12,30,0,0,8)] #csv representation of y time-series 2011-12-30 00:00:00,-310.0 2011-12-30 00:00:01,-238.0 2011-12-30 00:00:01.500000,-114.0 2011-12-30 00:00:02.500000,60.0 2011-12-30 00:00:03,185.0 2011-12-30 00:00:04,259.0 2011-12-30 00:00:04.500000,231.0 2011-12-30 00:00:05.500000,139.0 2011-12-30 00:00:06.500000,55.0 2011-12-30 00:00:07,-49.0 2011-12-30 00:00:08,-144.0 index = y.index <class 'pandas.tseries.index.DatetimeIndex'> [2011-12-30 00:00:00, ..., 2011-12-30 00:00:08] Length: 11, Freq: None, Timezone: None #_max returned from the peakdetect function, one local maxima for this 8 seconds period _max = [[5, 259.0]] indexes = [x[0] for x in _max] #[5] timestamps = [index[z] for z in indexes] #[<Timestamp: 2011-12-30 00:00:04>] print raw_disp.ix[timestamps] #Empty DataFrame #Columns: array([sig_qual, heave, north, west, extrema], dtype=object) #Index: <class 'pandas.tseries.index.DatetimeIndex'> #Length: 0, Freq: None, Timezone: None for timestamp in timestamps: print raw_disp.ix[timestamp] #sig_qual 0 #heave 259 #north 27 #west 132 #extrema 0 #Name: 2011-12-30 00:00:04 并且每个元素都是<class 'pandas.tseries.index.DatetimeIndex'>类型的我自己的代码不同,我认为传递<class 'pandas.lib.Timestamp'>列表与传递单个时间戳的工作方式相同,被认为是一个错误?

如果我使用索引创建原始pandas.lib.Timestamp作为字符串列表,则查询字符串列表可以正常工作。它确实显着增加了DataFrame的字节大小。

更新3: 只有非常大的DataFrame才会出现错误,我在不同大小的DataFrame上重新编写代码(下面的注释中的一些细节),它似乎发生在270万条记录以上的DataFrame上。使用字符串而不是TimeStamps可以解决问题,但会增加内存使用量。

固定 在最新的github master(18/09/2012)中,请参阅Wes在页面底部的评论。

1 个答案:

答案 0 :(得分:18)

df.ix [my_list_of_dates]应该可以正常工作。

In [193]: df
Out[193]:
            A  B  C  D
2012-08-16  2  1  1  7
2012-08-17  6  4  8  6
2012-08-18  8  3  1  1
2012-08-19  7  2  8  9
2012-08-20  6  7  5  8
2012-08-21  1  3  3  3
2012-08-22  8  2  3  8
2012-08-23  7  1  7  4
2012-08-24  2  6  0  6
2012-08-25  4  6  8  1

In [194]: row_pos = [2, 6, 9]

In [195]: df.ix[row_pos]
Out[195]:
            A  B  C  D
2012-08-18  8  3  1  1
2012-08-22  8  2  3  8
2012-08-25  4  6  8  1

In [196]: dates = [df.index[i] for i in row_pos]

In [197]: df.ix[dates]
Out[197]:
            A  B  C  D
2012-08-18  8  3  1  1
2012-08-22  8  2  3  8
2012-08-25  4  6  8  1