我有一只大熊猫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 函数,该函数在两个单独的列表中返回局部最大值和最小值的索引和值。我提取最大值的索引位置并使用DataFrame.index
我得到一个熊猫时间戳列表。
然后,我尝试通过将 TimeStamps 列表传递给来提取大型 DataFrame 的相关子集,.ix[]
但它似乎总是返回一个空的DataFrame
. 我可以遍历 TimeStamps 列表并从中获取相关行,DataFrame
但这是一个漫长的过程,我认为ix[]
应该根据文档接受值列表?
(尽管我看到 Pandas 0.7 的示例使用 a numpy.ndarray
of numpy.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:
我创建了一个 gist,它实际上是有效的,因为当从 csv 加载数据时,时间戳的索引列存储为对象的 numpy 数组,这些对象看起来是字符串。与我自己的代码中索引是 type<class 'pandas.tseries.index.DatetimeIndex'>
并且每个元素都是 type 不同<class 'pandas.lib.Timestamp'>
,我认为传递一个列表pandas.lib.Timestamp
与传递单个时间戳的工作方式相同,这会被认为是一个错误吗?
如果我将索引创建为字符串列表的原始DataFrame
文件,则使用字符串列表进行查询可以正常工作。它确实显着增加了 DataFrame 的字节大小。
更新 3: 错误似乎只发生在非常大的 DataFrame 上,我重新运行了不同大小的 DataFrame 的代码(下面的评论中有一些细节),它似乎发生在超过 270 万条记录的 DataFrame 上。使用字符串而不是时间戳可以解决问题,但会增加内存使用量。
已修复 在最新的 github master (18/09/2012) 中,请参阅页面底部 Wes 的评论。