Несогласованные преобразования Pandas to_datetime

#python #pandas #datetime #timestamp

Вопрос:

Вот MRE, чтобы продемонстрировать проблему:

 a = pd.DataFrame({'date': ['2021-01-01 00:00:00 1:00', '2021-01-01 00:00:01 1:00']}) 
b = pd.DataFrame({'date': ['2021-01-01 00:00:00 1:00', '2021-01-01 00:00:01 2:00']}) 

a['date'] = pd.to_datetime(a.date)
b['date'] = pd.to_datetime(b.date)
a.date.iloc[-1]
# gives Timestamp('2021-01-01 00:00:01 0100', tz='pytz.FixedOffset(60)')

b.date.iloc[-1]
# datetime.datetime(2021, 1, 1, 0, 0, 1, tzinfo=tzoffset(None, 7200))
 

Таким a образом, строки datetime из одного часового пояса преобразуются в метку времени, b строки datetime из двух разных часовых поясов преобразуются в объект datetime.datetime.

Это проблема, потому что я хочу использовать средство .dt доступа в кадре данных, например b , для преобразования часовых поясов, но эта (очевидная) ошибка меня останавливает.

Ответ №1:

Проблема, с которой вы сталкиваетесь, заключается в том, что a['date'] , скорее всего, она будет храниться в виде правильного массива за сценой. While b['date'] имеет разные типы и должен храниться в виде списка разных типов.

Один из способов сделать это-использовать utc=True аргумент:

 pd.to_datetime(b.date, utc=True)
 

https://pandas.pydata.org/docs/reference/api/pandas.to_datetime.html

Вот несколько тестовых кодов:

 a['date'] = pd.to_datetime(a.date, utc=True)
b['date'] = pd.to_datetime(b.date, utc=True)
aval = a.date.iloc[-1]
print(aval)
print(type(aval))
print(a['date'].dt)
print(a['date'])

bval = b.date.iloc[-1]
print(bval)
print(type(bval))
print(b['date'].dt)
print(b['date'])
 

Выход:

 2020-12-31 23:00:01 00:00
<class 'pandas._libs.tslibs.timestamps.Timestamp'>
<pandas.core.indexes.accessors.DatetimeProperties object at 0x7f4aa41f3c40>
0   2020-12-31 23:00:00 00:00
1   2020-12-31 23:00:01 00:00
Name: date, dtype: datetime64[ns, UTC]
2020-12-31 22:00:01 00:00
<class 'pandas._libs.tslibs.timestamps.Timestamp'>
<pandas.core.indexes.accessors.DatetimeProperties object at 0x7f4aa41f3b20>
0   2020-12-31 23:00:00 00:00
1   2020-12-31 22:00:01 00:00
Name: date, dtype: datetime64[ns, UTC]
 

Но убедитесь, что преобразование в UTC выполнено правильно, т. Е. что метка времени UTC настроена соответствующим образом с учетом часовых поясов. Я не проверял.

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

1. тип данных pandas datetime64[ns] не может хранить элементы со смешанными смещениями UTC в одной серии (массиве), но он может хранить один часовой пояс . Поэтому полезным дополнением здесь было бы проанализировать UTC, как вы показываете, а затем преобразовать в соответствующий часовой пояс с помощью .dt.tz_convert .

2. Спасибо вам за это, как ни странно, я «попробовал» utc=True , но обнаружил, что это не сработало. Повторная попытка свежим утром действительно сработала, так что я явно делал что-то не так.