2016-12-14 68 views
0

我有一个熊猫据帧df,其中有三列(timefromto)。我想执行一个函数,它将循环使用df['time']。当前时间等于df['time']中的时间时,请调用另一个函数,如打印某物。每行只会执行一次。在真实数据中,该脚本将在云中执行24小时。Python的循环一整天,当当前时间等于给定的时间,做一些

import pandas as pd 
df=pd.DataFrame({'time':['08:35','09:35','09:45','10:10'], 
       'from':['SHH','SZH','WXH','ZJH'], 
       'to':['NJH','NJH','NJH','NJH']}) 
df 

    from time to 
0 SHH  08:35 NJH 
1 SZH  09:35 NJH 
2 WXH  09:45 NJH 
3 ZJH  10:10 NJH 

例如,当当前时间是08:35,打印Time is reached, train from SHH to NJH,并当当前时间是09:35,打印Time is reached, train from SZH to NJH。我不知道如何修改下面的代码来满足我的 工作。需要帮忙。

import datetime 
import time 

def ex(a,b): 
    print("Time is reached. train from {} to {}".format(a, b)) 

time_ls = list(df['time']) 
from_ls = list(df['from']) 
to_ls = list(df['to']) 

def run(): 
    for i in range(len(df['time'])): 
     while time.strftime("%H:%M", time.localtime()) == df['time'][i]: 
      time_ls.remove(df['time'][i]) 
      yield ex(from_ls[i],to_ls[i]) 
+0

你可能想看看[箭头] (https://github.com/crsmithdev/arrow)这个库使与日期时间的交互更容易和更具可读性。 – matyas

+1

如果每秒钟/每分钟处理整个数据帧变得过重,那么您可能还会考虑根据您知道的时间设置调度程序。有关基础库中的内容,请参见[sched](https://docs.python.org/2/library/sched.html#sched.scheduler.enterabs)。 –

回答

1

如果你想从一个pandas.DataFrame满足一定条件提取行,你要裁DataFrame,而不是手动遍历所有的行和检查对自己的这一条件。这个实现方式比任何手动尝试都快。

一旦你得到了仅包含匹配当前时间(小时和分钟)的行数据框,你可以遍历较小DataFrame并打印它的每个行的结果(因为你知道,它仅包含那些匹配的行)。

请看下面的例子:

from datetime import datetime as dt 
import pandas as pd 

if __name__ == '__main__': 
    df = pd.DataFrame({ 
     'time': ['08:35','09:35','09:45','10:10'], 
     'from': ['SHH','SZH','WXH','ZJH'], 
     'to': ['NJH','NJH','NJH','NJH']}) 

    ct = dt.strftime(dt.now(), '%H:%M') # Get current hours and minutes 
    dn = df.loc[df['time'] == ct] # Slice DataFrame based on 'time' column 

    for row in dn.iterrows(): 
     # Iterate over all rows that meet the condition and print it 
     print('{time:s} -- train from {from:s} to {to:s}.'.format(**dict(row[1]))) 

它产生(如果小时,在这个例子中ct字符串匹配08:35分钟):

08:35 -- train from SHH to NJH. 
+0

谢谢你的帮助。但我想整天运行这个脚本。所以,当所有的行都被打印的时候,脚本会整天环绕。 –

+0

我希望你想用'cron'每分钟运行一次。这可以确保您不会错过任何一分钟,并且可能会减少资源消耗。 – jbndlr

+0

我明白了,再次感谢。 @jbndlr –