如何避免嵌套的for循环'在Python?

时间:2017-04-24 08:58:03

标签: python loops for-loop dataframe nested-loops

我有以下格式的数据框(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,依此类推。发布这个,我想在'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循环,此代码需要花费大量时间才能运行。是否有更有效的方法来做同样的事情?

2 个答案:

答案 0 :(得分: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 :(得分:1)

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

Condition="Exists(@(IntermediateAssembly))"