python - 使用时间戳列表选择由 DatetimeIndex 索引的 Pandas DataFrame 的子集

标签 python time-series pandas

我有一只 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 时间戳列表。

然后我尝试通过将时间戳列表传递给 .ix[] 来提取大型 DataFrame 的相关子集但它似乎总是返回一个空的 DataFrame .我可以遍历时间戳列表并从 DataFrame 中获取相关行但这是一个漫长的过程,我认为 ix[]应该根据 the docs 接受值列表? (尽管我看到 Pandas 0.7 的示例使用 numpy.ndarraynumpy.datetime64 )

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

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

更新 2:created a gist ,这实际上是有效的,因为当从 csv 加载数据时,时间戳的索引列存储为 numpy 对象数组,这些对象看起来是字符串。与我自己的代码不同,索引的类型是 <class 'pandas.tseries.index.DatetimeIndex'>每个元素的类型都是 <class 'pandas.lib.Timestamp'> , 我想传递 pandas.lib.Timestamp 的列表与传递单个时间戳的工作方式相同,这会被视为错误吗?

如果我创建原始 DataFrame将索引作为字符串列表,使用字符串列表进行查询工作正常。不过,它确实会显着增加 DataFrame 的字节大小。

更新 3: 该错误似乎只发生在非常大的 DataFrame 上,我在不同大小的 DataFrame 上重新运行代码(下面的评论中有一些细节)并且它似乎发生在超过 270 万条记录的 DataFrame 上。使用字符串而不是时间戳可以解决问题,但会增加内存使用量。

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

最佳答案

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

关于python - 使用时间戳列表选择由 DatetimeIndex 索引的 Pandas DataFrame 的子集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11991627/

相关文章:

python - 一种编写自写测试方法的 Pythonic 方式

python - 在 Python 上运行多个 Turtle Speed

python-3.x - 无法逆转 pandas 数据帧中的第一个差异

python - 将 pandas 中的多列除以另一列

python,按作为每个元素的子字符串的键对列表进行排序

python - 列出预训练模型中 spaCy 中最相似的词

machine-learning - 我可以构建一个包含自变量(时间序列+分类+数字)和分类器因变量(0,1)的机器学习模型吗

r - 使用R将时间序列中的事件分组

python - 2016 年 Pandas 数据框用户数量最多

python - 当 Pandas 满足条件时,从下一行返回值