сравнение массива панд индекса datetime с объектом datetime

#python #pandas #dataframe #datetime

Вопрос:

Я пытаюсь удалить любые данные в фрейме данных pandas до определенной отметки времени (я использую сейчас для этого примера).

candle_data[мин] — это мой фрейм данных…

 candle_data[min].loc[candle_data[min].index < pd.to_datetime(datetime.datetime.utcnow(), unit='ns')]
TypeError: Invalid comparison between dtype=datetime64[ns, UTC] and Timestamp
 

вот фрейм данных данных

 candle_data[min].loc[candle_data[min].index]
                           volume  complete        o        h        l        c
time                                                                           
2021-09-06 20:00:00 00:00     353      True  1.25344  1.25374  1.25324  1.25362
2021-09-06 20:05:00 00:00     125      True  1.25357  1.25357  1.25320  1.25338
2021-09-06 20:10:00 00:00      75      True  1.25336  1.25354  1.25332  1.25333
2021-09-06 20:15:00 00:00      70      True  1.25336  1.25356  1.25331  1.25336
2021-09-06 20:20:00 00:00      68      True  1.25333  1.25352  1.25332  1.25338
...                           ...       ...      ...      ...      ...      ...
2021-09-08 13:45:00 00:00     429      True  1.26782  1.26891  1.26758  1.26879
2021-09-08 13:50:00 00:00     363      True  1.26877  1.26901  1.26822  1.26831
2021-09-08 13:55:00 00:00     340      True  1.26829  1.26832  1.26657  1.26680
2021-09-08 14:00:00 00:00    1219      True  1.26688  1.26797  1.26460  1.26790
2021-09-08 14:05:00 00:00     654      True  1.26786  1.26858  1.26641  1.26650
[499 rows x 6 columns]

 

и вот что дает мне pd.to_datetime

 pd.to_datetime(datetime.datetime.utcnow(), unit='ns')
Timestamp('2021-09-08 14:34:37.175469')
 

Я попытался просмотреть другие статьи и Google, но мне не удалось избежать очень похожего сообщения… Как я могу преобразовать метку времени во что-то, что можно сравнить?

Комментарии:

1. Почему вы хотите использовать Python datetime в первую очередь? Вы могли бы просто использовать типы панд, например pd.Timestamp('2021-09-08 14:34:37.175469') , или pd.Timestamp('now')

Ответ №1:

Все в порядке, используете ли вы pd.Timestamp объект (созданный с помощью pd.to_datetime метода в вашем вопросе) или непосредственно datetime библиотеку Python. В некоторых случаях есть некоторые различия (и я бы вообще предпочел придерживаться использования объектов pandas при работе с кадрами данных), но в вашем случае проблема заключается в разнице часовых поясов.

Ваш индекс локализован ( datetime64[ns, UTC] ), но не ваш объект datetime. Это может кого-то немного смутить, потому что вы используете utcnow метод. Этот метод вернет текущее время utc, но не локализованное, что означает, что это объект datetime без часового пояса.

Решение простое, вы можете сделать одно из следующих действий (и вы можете немного поэкспериментировать с ним, чтобы понять, как это работает).:

  • используйте индекс без часового пояса: candle_data.index.tz_localize(None) < pd.to_datetime(datetime.datetime.utcnow(), unit='ns')
  • локализуйте свой объект метки времени: candle_data.index < pd.to_datetime(datetime.datetime.utcnow(), unit='ns', utc=True)
  • локализуйте объект метки времени без использования даты и времени: candle_data[min].index < pd.Timestamp("now", tz="UTC")

И существует все больше и больше способов, как это сделать. И я бы вообще рекомендовал использовать нарезку вместо такого сравнения с индексом. Вы могли бы сделать, например, следующее:

 candle_data[:datetime.datetime.utcnow()]
# or
candle_data[:pd.Timestamp("now")]
 

Он вернет все данные, в которых индекс datetime меньше текущего времени.