Почему разница даты и времени равна нулю для двух строк в кадре данных? - PullRequest
0 голосов
/ 08 июля 2019

Эта проблема, с которой я сталкиваюсь, очень проста, но странна и беспокоит меня до бесконечности.

У меня есть следующий фрейм данных:

df['datetime'] = df['datetime'].dt.tz_convert('US/Pacific') 
#converting datetime from datetime64[ns, UTC] to datetime64[ns,US/Pacific]

df.head()

                vehicle_id  trip_id                                 datetime    
        6760612 1000500 4f874888ce404720a203e36f1cf5b716    2017-01-01 10:00:00-08:00       
        6760613 1000500 4f874888ce404720a203e36f1cf5b716    2017-01-01 10:00:01-08:00    
        6760614 1000500 4f874888ce404720a203e36f1cf5b716    2017-01-01 10:00:02-08:00      
        6760615 1000500 4f874888ce404720a203e36f1cf5b716    2017-01-01 10:00:03-08:00       
        6760616 1000500 4f874888ce404720a203e36f1cf5b716    2017-01-01 10:00:04-08:00

df.info ()

vehicle_id         int64
trip_id            object
datetime           datetime64[ns, US/Pacific]

Я пытаюсь выяснить разницу во времени данных следующим образом (двумя различными способами):

df['datetime_diff'] = df['datetime'].diff()

df['time_diff'] = (df['datetime'] - df['datetime'].shift(1)).astype('timedelta64[s]')

Для определенного trip_id у меня есть следующие результаты:

df[trip_frame['trip_id'] == '4f874888ce404720a203e36f1cf5b716'][['datetime','datetime_diff','time_diff']].head()

        datetime                  datetime_diff time_diff
6760612 2017-01-01 10:00:00-08:00   NaT             NaN
6760613 2017-01-01 10:00:01-08:00   00:00:01        1.0
6760614 2017-01-01 10:00:02-08:00   00:00:01        1.0
6760615 2017-01-01 10:00:03-08:00   00:00:01        1.0
6760616 2017-01-01 10:00:04-08:00   00:00:01        1.0

Но для некоторых других trip_ids, таких как приведенные ниже, вы можете заметить, что у меня разница в дате и времени равна нулю (для обоих столбцов), когда ее на самом деле нет. Разница во времени в секундах.

df[trip_frame['trip_id'] == '01b8a24510cd4e4684d67b96369286e0'][['datetime','datetime_diff','time_diff']].head(4)

         datetime            datetime_diff  time_diff
3236107 2017-01-28 03:00:00-08:00   0 days  0.0
3236108 2017-01-28 03:00:01-08:00   0 days  0.0
3236109 2017-01-28 03:00:02-08:00   0 days  0.0
3236110 2017-01-28 03:00:03-08:00   0 days  0.0

df[df['trip_id'] == '01c2a70c25e5428bb33811ca5eb19270'][['datetime','datetime_diff','time_diff']].head(4)

        datetime             datetime_diff  time_diff
8915474 2017-01-21 10:00:00-08:00   0 days  0.0
8915475 2017-01-21 10:00:01-08:00   0 days  0.0
8915476 2017-01-21 10:00:02-08:00   0 days  0.0
8915477 2017-01-21 10:00:03-08:00   0 days  0.0

Есть ли какие-либо сведения о том, что является реальной проблемой? Я буду очень благодарен.

1 Ответ

0 голосов
/ 08 июля 2019

Если я просто выполню ваш код без преобразования типов, все будет хорошо:

df.timestamp - df.timestamp.shift(1)

На строках примера

rows=['2017-01-21 10:00:00-08:00',
 '2017-01-21 10:00:01-08:00',
 '2017-01-21 10:00:02-08:00',
 '2017-01-21 10:00:03-08:00',
 '2017-01-21 10:00:03-08:00']  # the above lines are from your example. I just invented this last line to have one equal entry
df= pd.DataFrame(rows, columns=['timestamp'])
df['timestamp']= df['timestamp'].astype('datetime64')
df.timestamp - df.timestamp.shift(1)

Последняя строка возвращает

Out[40]: 
0        NaT
1   00:00:01
2   00:00:01
3   00:00:01
4   00:00:00
Name: timestamp, dtype: timedelta64[ns]

Это выглядит пока ничего не подозревающего. Обратите внимание, что у вас уже есть серия timedelta64.

Если я сейчас добавлю ваше преобразование, я получу:

(df.timestamp - df.timestamp.shift(1)).astype('timedelta64[s]')
Out[42]: 
0    NaN
1    1.0
2    1.0
3    1.0
4    0.0
Name: timestamp, dtype: float64

Вы видите, что результатом является серия операций с плавающей точкой. Вероятно, это потому, что в серии есть NaN. Еще одна вещь, это дополнение [s]. Это не похоже на работу. Если вы используете [ns], это похоже на работу. Если вы хотите как-то избавиться от нано секунд, я думаю, вам нужно сделать это отдельно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...