#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 меньше текущего времени.