помечать строки меткой времени между временами - PullRequest
0 голосов
/ 21 октября 2018

Мне нужно отметить строки во временном ряду, где временные метки попадают между заданными блоками времени суток;например, когда у меня есть

values = ([ 'motorway' ] * 5000) + ([ 'link' ] * 300) + ([ 'motorway' ] * 7000)

df = pd.DataFrame.from_dict({
  'timestamp': pd.date_range(start='2018-1-1', end='2018-1-2', freq='s').tolist()[:len(values)],
  'road_type': values,
})
df.set_index('timestamp', inplace=True)

, мне нужно добавить столбец rush, который помечает строки, где timestamp находится между 06:00 и 09:00 или 15:30 и 19:00.Я видел Между-временем , но я не знаю, как применить его здесь.

edit: на основе этот ответ Мне удалось собрать

df['rush'] = df.index.isin(df.between_time('00:00:15', '00:00:20', include_start=True, include_end=True).index) | df.index.isin(df.between_time('00:00:54', '00:00:59', include_start=True, include_end=True).index)

но мне интересно, нет ли более элегантного способа.

1 Ответ

0 голосов
/ 21 октября 2018

Одна альтернатива с использованием between

from datetime import time as t

values = ([ 'motorway' ] * 5000) + ([ 'link' ] * 300) + ([ 'motorway' ] * 7000)

df = pd.DataFrame.from_dict({
 'timestamp': pd.date_range(start='2018-1-1', end='2018-1-2',
                               freq='s').tolist()[:len(values)],
  'road_type': values,
})

time = df['timestamp'].dt.time

df['rush'] = (time.between(t(0,6,0), t(0,9,0)) | time.between(t(0,15,30),t(0,19,0))).values

Или нарезка df с использованием datetime.time

df = df.set_index(df.timestamp.dt.time)

df['rush'] = df.index.isin(df[t(0,6,0):t(0,9,0)].index | df[t(0,15,30):t(0,19,0)].index)

df = df.reset_index(drop=True)
...