Pandas时间序列添加列显示1小时间隔

时间:2016-08-05 09:04:55

标签: python pandas

我可以使用data['hod'] = [r.hour for r in data.index]在Pandas中创建一小时的列,这对于groupby相关分析非常有用。但是,我希望能够在09:30而不是09:00开始创建一个类似的列,间隔为1小时。所以列值为09:30-10:30,10:30-11:30等。

目的是能够对这些值进行分组,以获得该时间段的统计数据。

使用如下数据。我已经添加了一天中的小时,一周中的某一天等等,我只需要从09:30开始以一小时的间隔切换时间:

data['2008-05-06 09:00:00':].head()


Open    High    Low Last    Volume  hod dow dom minute
Timestamp                                   
2008-05-06 09:00:00 1399.50 1399.50 1399.25 1399.50 4   9   1   6   0
2008-05-06 09:01:00 1399.25 1399.75 1399.25 1399.50 5   9   1   6   1
2008-05-06 09:02:00 1399.75 1399.75 1399.00 1399.50 19  9   1   6   2
2008-05-06 09:03:00 1399.50 1399.75 1398.50 1398.50 37  9   1   6   3
2008-05-06 09:04:00 1398.75 1399.00 1398.75 1398.75 15  9   1   6   4

1 个答案:

答案 0 :(得分:0)

我认为当你从每小时的一半开始时,你将一天划分为25个部分而不是24个部分。这是我如何标记这些部分:第-1节:[0:00,0:29],部分0:[0:30,1:29],第1节:[1:30,2:29] ......第22节:[22:30,23:29]和第23节:[23:30,23: 50],其中第一段和最后一段是半小时。

这是一个使用pandas的实现

import pandas as pd
import numpy as np

def shifted_hour_of_day(ts, beginning_of_hour=0):
    shift = pd.Timedelta('%dmin' % (beginning_of_hour))
    ts_shifted = ts - pd.Timedelta(shift)
    hour = ts_shifted.hour
    if ts_shifted.day != ts.day:  # we shifted these timestamps to yesterday
        hour = -1  # label the first section as -1
    return hour

# Generate random data
timestamps = pd.date_range('2008-05-06 00:00:00', '2008-05-07 00:00:00', freq='10min')
vals = np.random.rand(len(timestamps))
df = pd.DataFrame(index=timestamps, data={'value': vals})
df.loc[:, 'hod'] = [r.hour for r in df.index]
# Test shifted_hour_of_day
df.loc[:, 'hod2'] = [shifted_hour_of_day(r, beginning_of_hour=20) for r in df.index]
df.head(20)

现在,您可以将此DataFrame分组到' hod2'。