Как я могу использовать diff, чтобы выбрать время, которое близко друг к другу, но в неизвестном диапазоне? - PullRequest
0 голосов
/ 07 декабря 2018

Следующий набор данных содержит метки времени gps автобусов, прибывающих на определенную остановку.В то время как шины бездействуют на остановке, передатчики GPS продолжают отправлять данные с полурегулярными приращениями.

Я пытаюсь скомпилировать время отправления каждого автобуса с этой одной автобусной остановки.Однако усложняющим фактором является то, что одни и те же автобусы могут повторять маршрут примерно с 2-часовыми интервалами.

В приведенном ниже кадре данных, если шина NYCT_1202 останавливается на 10:01:19 в строке 0 и остается на остановке до 10:11:48 в строке 1, я хочу как-то выбрать для 10:11:48.

Точно так же, после двух часов, когда один и тот же автобус объезжал, чтобы снова доехать до остановки в ряду 2 на 12:51:31, он «бездействует» (возможно, он не работал), пока13:51:02.Я хочу выбрать в последний раз, 13:51:02.

df = pd.DataFrame({'RecordedAtTime': {0: Timestamp('2017-08-23 10:01:19'),
  1: Timestamp('2017-08-23 10:11:48'),
  2: Timestamp('2017-08-23 12:51:31'),
  3: Timestamp('2017-08-23 13:02:02'),
  4: Timestamp('2017-08-23 13:11:27'),
  5: Timestamp('2017-08-23 13:51:35'),
  6: Timestamp('2017-08-23 16:12:27'),
  7: Timestamp('2017-08-23 16:52:25'),
  8: Timestamp('2017-08-07 09:33:42'),
  9: Timestamp('2017-08-07 10:13:36')},
 'VehicleRef': {0: 'NYCT_1202',
  1: 'NYCT_1202',
  2: 'NYCT_1202',
  3: 'NYCT_1202',
  4: 'NYCT_1202',
  5: 'NYCT_1202',
  6: 'NYCT_1202',
  7: 'NYCT_1202',
  8: 'NYCT_1206',
  9: 'NYCT_1206'}})

       RecordedAtTime VehicleRef
0 2017-08-23 10:01:19  NYCT_1202
1 2017-08-23 10:11:48  NYCT_1202 <-This Row

2 2017-08-23 12:51:31  NYCT_1202
3 2017-08-23 13:02:02  NYCT_1202
4 2017-08-23 13:11:27  NYCT_1202
5 2017-08-23 13:51:35  NYCT_1202 <-This Row

6 2017-08-23 16:12:27  NYCT_1202
7 2017-08-23 16:52:25  NYCT_1202 <-This Row

8 2017-08-07 09:33:42  NYCT_1206
9 2017-08-07 10:13:36  NYCT_1206 <-This Row

Если бы автобусы не возвращались, я мог бы использовать df.groupby(by=['VehicleRef','RecordedAtTime']).last, чтобы выбрать в последний раз.

Я также попытался создать столбец TimeDelta с df['TimeDelta']=df['RecordedAtTime'].diff, чтобы применить df.loc[lambda x: x['TimeDelta']>2].Однако diff не приводит к разнице между 0-м и 1-м разами в строке 0, что означает, что я не могу выбрать строки по их временным дельтам.

       RecordedAtTime VehicleRef          timeDelta
0 2017-08-23 10:01:19  NYCT_1202                NaT <-Should be 00:10:29
1 2017-08-23 10:11:48  NYCT_1202    0 days 00:10:29 <-Should be 02:39:43

2 2017-08-23 12:51:31  NYCT_1202    0 days 02:39:43
3 2017-08-23 13:02:02  NYCT_1202    0 days 00:10:31
4 2017-08-23 13:11:27  NYCT_1202    0 days 00:09:25
5 2017-08-23 13:51:35  NYCT_1202    0 days 00:40:08 <-Should be 02:20:52

6 2017-08-23 16:12:27  NYCT_1202    0 days 02:20:52
7 2017-08-23 16:52:25  NYCT_1202    0 days 00:39:58 <-Should be +16:41:17

8 2017-08-07 09:33:42  NYCT_1206 -17 days +16:41:17
9 2017-08-07 10:13:36  NYCT_1206    0 days 00:39:54 <-Should be next difference

Так какую библиотеку панд я мог бы использоватьДля решения этой проблемы?Есть ли лучший способ использовать .diff или мне следует подойти к этой проблеме совершенно по-другому?

1 Ответ

0 голосов
/ 07 декабря 2018
import pandas as pd
from pandas import Timestamp
import datetime as datetime

# Approximate trip duration
trip_minutes = datetime.timedelta(minutes = 90)

# Ensure ordering by time grouped by vehicle
df  = df.sort_values('RecordedAtTime')
dfg = df.groupby('VehicleRef')

# Elapsed time interval is the difference, within vehicle group
df['Elapsed'] = dfg['RecordedAtTime'].diff()

# Elapsed time close to the trip time indicates a trip ending
df['isEnd'] = df['Elapsed'] > trip_minutes

# The start is the row just before the last end - use shift  within group
df['isStart'] = dfg['isEnd'].shift(-1)

# select the rows ensuring that a NaN start event is included
df[df['isStart'] != False]

Результаты:

       RecordedAtTime VehicleRef  Elapsed  isEnd isStart
9 2017-08-07 10:13:36  NYCT_1206 00:39:54  False     NaN
1 2017-08-23 10:11:48  NYCT_1202 00:10:29  False    True
5 2017-08-23 13:51:35  NYCT_1202 00:40:08  False    True
7 2017-08-23 16:52:25  NYCT_1202 00:39:58  False     NaN
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...