2016-08-05 133 views
0

我可以使用data['hod'] = [r.hour for r in data.index]在Pandas中創建一天中的小時列,這對於groupby相關分析非常有用。但是,我希望能夠創建一個類似的列,從09:30開始,而不是從09:00開始,每隔1小時進行一次。因此列值將爲09:30-10:30,10:30-11:30等。熊貓時間系列添加列顯示1小時區間

目標是能夠將這些值分組以獲得時間段的統計數據。

使用數據如下。我已經加一天的時間,星期等一天,我只需要從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

請詳細解釋。這只是給我輸出'DatetimeIndex([],dtype ='datetime64 [ns]',freq ='H')' – ade1e

+0

@adele,你能發佈想要的數據集嗎? – MaxU

+0

您好Maxu,我只需要一些我可以使用groupby以類似的方式,我爲每個標準小時在下面的例子'data ['2016']。groupby('hod')。Volume.mean()'hod由'[r.hour for data in.index]'生成。如果這意味着我需要一個名爲「非標準時間間隔」的新列,顯示09:30-10:30,10:30-11:30等等。如果還有另一種方法可以讓我的隊伍抓住09:30-10:30等等,那也很棒。希望這是有道理的。 – ade1e

回答

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],第一節和最後一節半小時。

這裏是大熊貓

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) 

現在你可以在GROUPBY 'hod2' 這個數據幀的實現。