1

我有一系列每小时的价格。每个价格在整个 1 小时内都有效。在 Pandas 中表示这些价格的最佳方式是什么,可以让我以任意更高的频率(例如分钟或秒)对它们进行索引并用它们进行算术运算?

数据细节

样品价格可能是:

>>> prices = Series(randn(5), pd.date_range('2013-01-01 12:00', periods = 5, freq='H'))
>>> prices
2013-01-01 12:00:00   -1.001692
2013-01-01 13:00:00   -1.408082
2013-01-01 14:00:00   -0.329637
2013-01-01 15:00:00    1.005882
2013-01-01 16:00:00    1.202557
Freq: H

现在,如果我想要在13:37:42(我希望它与 13:00 相同)时使用什么表示?

>>> prices['2013-01-01 13:37:42']
...
KeyError: <Timestamp: 2013-01-01 13:37:42>

重采样

我知道我可以重新采样价格并填写详细信息(ffill,对吗?),但这似乎不是一个很好的解决方案,因为我必须假设我将要索引它的频率并且它降低了可读性有太多不必要的数据点。

时间跨度

乍一看PeriodIndex似乎工作

>>> price_periods = prices.to_period()
>>> price_periods['2013-01-01 13:37:42']
-1.408082

但是一个时间跨度的系列并没有提供我期望从Series. 假设我有另一个系列amounts,说明我在某个时刻购买了多少商品。如果我想计算价格,我想将这两个系列相乘'

>>> amounts = Series([1,2,2], pd.DatetimeIndex(['2013-01-01 13:37', '2013-01-01 13:57', '2013-01-01 14:05']))
>>> amounts*price_periods

但这会产生异常,有时甚至会冻结我的 IPy Notebook。索引也无济于事。

>>> ts_periods[amounts.index]

结构是否PeriodIndex仍在进行中,或者这些功能不会被添加?是否有其他一些我应该使用的结构(或者现在应该使用,在PeriodIndex成熟之前)?我正在使用 Pandas 版本0.9.0.dev-1e68fd9

4

1 回答 1

3

查看asof

prices.asof('2013-01-01 13:37:42')

返回上一个可用日期时间的值:

prices['2013-01-01 13:00:00']

要进行计算,您可以使用:

prices.asof(amounts.index) * amounts

它返回一个带有数量索引和相应值的系列:

>>> prices
2013-01-01 12:00:00    0.943607
2013-01-01 13:00:00   -1.019452
2013-01-01 14:00:00   -0.279136
2013-01-01 15:00:00    1.013548
2013-01-01 16:00:00    0.929920

>>> prices.asof(amounts.index)
2013-01-01 13:37:00   -1.019452
2013-01-01 13:57:00   -1.019452
2013-01-01 14:05:00   -0.279136

>>> prices.asof(amounts.index) * amounts
2013-01-01 13:37:00   -1.019452
2013-01-01 13:57:00   -2.038904
2013-01-01 14:05:00   -0.558272
于 2013-01-07T14:43:03.790 回答