4

使用熊猫 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)

4

2 回答 2

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 对象。

于 2015-09-09T03:02:41.333 回答
0

Hour DateOffset 是“每小时”而不是“每小时每小时”。您可以尝试继承 Hour 来覆盖 onOffset。您还可以签出 TimeSeries.between_time 方法。

于 2012-07-19T16:58:35.510 回答