在熊猫中捕捉到几个小时

时间:2012-07-17 02:35:00

标签: python pandas time-series

使用 pandas 0.8.0

import pandas
import pandas.tseries.offsets
h = pandas.tseries.offsets.Hour()
times = pandas.date_range(start='2010-1-1 1:00:05', periods=3, freq='3H')
times
  

  [2010-01-01 01:00:05,...,2010-01-01 07:00:05]   长度:3,频率:3H,时区:无

times.snap(h)
  

  [2010-01-01 01:00:05,...,2010-01-01 07:00:05]   长度:3,频率:H,时区:无

这是因为:

h.onOffset(times[0])
  

我猜这个功能很新,似乎没有太多记录。

  

前滚和回滚方法完全符合您的期望:

我在这里的更大目标是使用2个频率(例如4小时和1天)并根据第一个频率模拟第二个频率(例如7:05:33 - > 1,19:59:59)来分解一系列时间戳 - > 4,21:44:00 - > 5)

2 个答案:

答案 0 :(得分:1)

我需要类似的东西,这是我实施的抢购30秒数据:

import pandas as pd
from pandas.tseries.offsets import Tick
from pandas.tslib import Timedelta


class HalfMinute(Tick):
    _inc = Timedelta(seconds=30)

    def _snap_delta(self, dt):
        d = Timedelta(seconds=dt.second, microseconds=dt.microsecond)
        if d >= self._inc:
            d -= self._inc
        return d

    def onOffset(self, dt):
        return not self._snap_delta(dt)

    def rollforward(self, dt):
        return dt + (self._inc - self._snap_delta(dt))

    def rollback(self, dt):
        return dt - self._snap_delta(dt)


def test_snap():
    from random import random
    from datetime import timedelta
    # 1 hour of test data
    grid_index = pd.date_range('2015-09-09 00:00:00', '2015-09-09 01:00:00', freq='30S')

    # add uniform noise of maximum +-5 seconds
    mess_index = pd.Index(dt + timedelta(seconds=(random() - 0.5) * 10)
                          for dt in grid_index)

    snapped_index = mess_index.snap(HalfMinute())

    assert snapped_index.equals(grid_index)

在你的情况下,你可以做类似的事情来制作一个Offset对象。

答案 1 :(得分:0)

小时DateOffset是“每小时”而不是“每小时一小时”。 您可以尝试将Hour子类化为覆盖onOffset。 您还可以签出TimeSeries.between_time方法。