2017-04-24 94 views
0

我有表格的數據框(df):如何避免在Python中嵌套'for循環'?

 SERV_OR_IOR_ID IMP_START_TIME IMP_CLR_TIME  TIME_BIN 
0   -1447310116 23:59:32.873000 00:11:28.755000 
1   1673545041 00:00:09.182000 00:01:06.912000 
2   -743717696 23:59:57.312000 00:00:32.428000 
3   -746373244 23:59:57.915000 00:05:33.232000 

我將每天的24小時到30分鐘的時間倉「,所以零時間倉是從00:00-00: 30,首先從00:30-01:00等等。在此之後,我想爲每行分配'TIME_BIN'列中的值,具體取決於'IMP_START_TIME'落在哪個時間窗口。 例如: 對於行'1',我將分配值'0',因爲它落在時間窗口'00:00'-00:30中。

對於這一點,我寫了下面的代碼:

interval = dt.timedelta(minutes=30) 
start = dt.time(0,0,0) 

grid =[(dt.datetime.combine(dt.date(1,1,1),start)+n*interval).time() for n in range(48)] 


for j in range(len(df)):   
    for i in range(0,47): 
     if df.ix[j,1] <grid[i+1] and df.ix[j,1] > grid[i]: 
      df.ix[j,3] = i 

     elif df.ix[j,1] > grid[47]: 
      df.ix[j,3] = 47 

此代碼需要花費大量的時間來嵌套for循環的運行因。有沒有更有效的方法來做同樣的事情?

+0

使用[拉鍊](https://docs.python.org/2/library/functions.html#zip),以儘量減少縮進層次 –

+1

你就不能加起來分鐘和數據幀中每行的小時數,然後除以30? 1:23 - > 83 - > 83/30 - > 2 –

+0

@DanielFrühauf - 謝謝!這工作:) – Shreyas

回答

1

這應該是更快:

index = pd.date_range('1/1/2000', periods=48, freq='30T').time 
index = {v: i for i, v in enumerate(index)} 
df['TIME_BIN'] = pd.to_datetime(df['IMP_CLR_TIME']).dt.floor('30T').dt.time.map(index) 
1

可以計算的,而不是查找所需斌。它應節省很多:

def halfhour_bin(time): 
    return ((time.hour*60)+time.minute)//30 

for j in range(len(df)):   
    df.ix[j,3] = halfhour_bin(df.ix[j,1])