Итерации по временным рядам - PullRequest
2 голосов
/ 07 марта 2019

Ниже приведен образец моего набора данных:

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 Ответ

1 голос
/ 07 марта 2019

Диапазон дат (секунд)

Кажется, вы используете 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 , она вернет datetime

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')]):
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...