随时间序列迭代

时间:2019-03-06 21:30:04

标签: python for-loop if-statement time jupyter

以下是我的数据集的示例:

index      time      speed
 0      00:00:00      15
 1      00:00:05      18
 2      00:00:10      23
 3      00:00:15      25
 4      00:00:20      34

我想创建一个for循环,其功能如下:

for i in range (0,5,1):
    if df.speed[i] > df.speed [i+2]:
         print ('Larger')
    else:
         print('Smaller')

但是,我想引用时间而不是FOR循环中的索引。例如:

for t in range (00:00:00, 00:00:20 , 5s):
  if df.speed[t] > df.speed [t+10s]: 
     print ('Larger')
  else:
     print('Smaller')

因此,FOR LOOP将在某个t处获取速度值,并将其与10秒钟后的速度值进行比较。如果较大,则打印较大,否则,较小。

感谢您的帮助。谢谢。

1 个答案:

答案 0 :(得分:1)

日期范围(秒)

您似乎正在使用pandas。如果是这样,您真的应该查看其时间序列功能:https://pandas.pydata.org/pandas-docs/stable/timeseries.html

更具体地说,在pandas.date_range()

import pandas as pd

pd.date_range('00:00:00', '00:00:20', freq='5s')

由于它是 date 范围函数,它将返回日期时间

DatetimeIndex(['2019-03-06 00:00:00',
               '2019-03-06 00:00:05',
                ...,
               '2019-03-06 00:00:20'], dtype='datetime64[ns]', freq='5S')

从这里只需使用.strftime()即可获得所需的内容:

pd.date_range('00:00:00', '00:00:20', freq='5s').strftime('%H:%M:%S')

返回

Index(['00:00:00', '00:00:05', ..., '00:00:20'], dtype='object')


按时间访问数据框

此后,为了使用此索引访问数据框,您有两个选择:

  1. 使用.loc查找这次的行:
for time in pd.date_range('00:00:00', '00:00:20', freq='5s').strftime('%H:%M:%S'):
    if (df.loc[df['time'] == time, 'speed'] ..):
  1. 通过使用set_index()重新定义数据帧索引,然后按时间直接访问它:
df.set_index('time', inplace=True)
for time in pd.date_range('00:00:00', '00:00:20', freq='5s').strftime('%H:%M:%S'):
    if (df.speed[time] ...):

编辑以解决评论问题

使用strftime()后,它将转换为字符串。您可以将其转换回以添加10秒,例如:

df.speed[(pd.to_datetime(time) + pd.to_timedelta(10, unit='s')).strftime('%H:%M:%S')].

或者:

for time in pd.date_range('00:00:00', '00:00:20', freq='5s'):
    if (df.speed[time.strftime('%H:%M:%S')]>df.speed[(time + pd.to_timedelta(10, unit='s')).strftime('%H:%M:%S')]):