簡體   English   中英

如何避免在Python中嵌套“ for循環”?

[英]How to avoid nested 'for loops' in Python ?

我有以下形式的數據框( df ):

        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分鍾的“時間段”,因此第0個時間段將從00:00-00:30開始,從00:30-01:00開始,依此類推。想要根據'IMP_START_TIME'屬於哪個時間窗口,在每一行的'TIME_BIN'列中分配一個值。例如:對於行'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循環,此代碼需要大量時間才能運行。 有沒有更有效的方式來做同樣的事情?

這應該更快:

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)

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

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])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM