使用 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)
答案 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方法。