Python 如何使用Pandas/Numpy中的dateOffset对日内时间序列数据进行重采样?

Python 如何使用Pandas/Numpy中的dateOffset对日内时间序列数据进行重采样?,python,numpy,pandas,time-series,Python,Numpy,Pandas,Time Series,我处理的是期货数据,当天在00:00:00之前开始。考虑到日期偏移量,我需要对1分钟到1小时的数据进行重新采样。让我们看一个例子: df1-1分钟数据 Open High Low Close 2005-09-06 17:27:00 1234.75 1234.75 1234.75 1234.75 2005-09-06 17:28:00 1234.75 1234.75 1234.75 1234.75 2005-0

我处理的是期货数据,当天在00:00:00之前开始。考虑到日期偏移量,我需要对1分钟到1小时的数据进行重新采样。让我们看一个例子:

df1-1分钟数据

                        Open     High      Low    Close
2005-09-06 17:27:00  1234.75  1234.75  1234.75  1234.75
2005-09-06 17:28:00  1234.75  1234.75  1234.75  1234.75
2005-09-06 17:29:00  1234.75  1234.75  1234.75  1234.75
2005-09-06 17:30:00  1234.75  1234.75  1234.50  1234.50
2005-09-06 18:01:00  1234.50  1234.50  1234.25  1234.50
2005-09-06 18:02:00  1234.50  1234.50  1234.50  1234.50
2005-09-06 18:03:00  1234.50  1234.50  1234.50  1234.50
2005-09-06 18:04:00  1234.50  1234.50  1234.50  1234.50
2005-09-06 18:05:00  1234.50  1234.50  1234.25  1234.25
这就是常规重采样的情况:

conversion = {'Open': 'first', 'High': 'max', 'Low': 'min', 'Close': 'last'}

In [77]: normal_resample = df1.resample(rule='60Min', how=conversion)
In [78]: normal_resample
Out[79]: 
                        Open     High      Low    Close
2005-09-06 17:00:00  1234.75  1234.75  1234.50  1234.50
2005-09-06 18:00:00  1234.50  1234.50  1234.25  1234.25
这是用于补偿的所需输出:

conversion = {'Open': 'first', 'High': 'max', 'Low': 'min', 'Close': 'last'}

In [77]: offset_resample = df1.resample(rule='60Min', how=conversion) + offset:18:00
In [78]: offset_resample
Out[79]: 
                        Open     High      Low    Close
2005-09-06 17:00:00  1234.75  1234.75  1234.50  1234.50
2005-09-07 18:00:00  1234.50  1234.50  1234.25  1234.25
请注意,我想要的是指定新的一天从“18:00:00”开始,而不是在午夜

我做了什么:我有一个公式,其中包括偏移量,每日数据的重采样,但我不知道如何将其调整为日内重采样

def resample_day(df):
    df.index = pd.DatetimeIndex(df.index)
    df = df.between_time('18:00', '16:00', include_start=True, include_end=True)
    proxy = df.index + pd.DateOffset(hours=6)  # This is the piece that does the trick
    result = df.groupby(proxy.date).agg(
        {'Open': 'first', 'High': 'max', 'Low': 'min', 'Close': 'last'})
    result = result.reindex(columns=['Open', 'High', 'Low', 'Close'])
    return result
而且,至少对我来说,什么是不起作用的


感谢您的输入。

您只需添加一天(如果时间超过下午5点):

[11]中的
:df1.index.time>datetime.time(17)
Out[11]:数组([False,True],dtype=bool)
在[12]中:df1.index+np.where((df1.index.time>datetime.time(17)),pd.offset.Day(1.nanos,0)
出[12]:
[2005-09-06 17:00:00, 2005-09-07 18:00:00]
长度:2,频率:60T,时区:无

+1对于重采样技巧,非常好!您的建议似乎是一个很好的解决方法,但我遇到了一个疯狂的错误:文件“”,第1行,在df1.index+np.where((df1.index.time>datetime.time(17)),pd.offset.Day(1.nanos,0)文件“C:\Users\Hernan\Anaconda\lib\site packages\pandas\tseries\index.py”,第619行,在add raise-TypeError(其他)TypeError:[0 0 86400000000000…,0 0 0 0]您使用的是pandas/numpy的旧版本吗?也许可以尝试:
pd.to_datetime(df1.index.values+np.where((df1.index.time>datetime.time(17)),pd.offset.Day(1.nanos,0))
或者可能是
df1.index.values.astype('int64'))
pd.\u version\u'0.14.0',numpy.version.version'1.8.1'pd.to_datetime(df1.index.values+np.where((df1.index.time>datetime.time(17)),pd.offset.Day(1.nano,0))给我一个空的df.和df1.index.values.astype('int64'))…不知道如何使用它。@hernanavella很有意思,也许这在0.14.1中已修复。因此,上面的目标是以纳秒为单位将datetime转换为int64,然后将其作为纳秒添加到datetime64(astype('int64')),然后换行到_datetime以获得纳秒到datetime64。您必须设置结果(新的DatetimeIndex)如果不清楚,则发送到df1.index,即df1.index=pd.to_datetime(…)
In [11]: df1.index.time > datetime.time(17)
Out[11]: array([False,  True], dtype=bool)

In [12]: df1.index + np.where((df1.index.time > datetime.time(17)), pd.offsets.Day(1).nanos, 0)
Out[12]:
<class 'pandas.tseries.index.DatetimeIndex'>
[2005-09-06 17:00:00, 2005-09-07 18:00:00]
Length: 2, Freq: 60T, Timezone: None