我可以使用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
答案 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'。