Преобразование столбца панд с несколькими часовыми поясами в один часовой пояс - PullRequest
2 голосов
/ 21 мая 2019

Проблема

У меня есть столбец в панде DataFrame, который содержит временные метки с часовыми поясами.В этом столбце присутствуют два разных часовых пояса, и я должен убедиться, что есть только один.Вот выходные данные конца столбца:

260003    2019-05-21 12:00:00-06:00
260004    2019-05-21 12:15:00-06:00
Name: timestamp, Length: 260005, dtype: object

Для чего бы то ни было, временные метки варьируются от -06:00 до -07:00 и имеют следующий вывод:

datetime.datetime(2007, 10, 1, 1, 0, tzinfo=tzoffset(None, -21600)) для -06:00 datetime.datetime(2007, 11, 17, 5, 15, tzinfo=tzoffset(None, -25200)) для -07:00

Что я сделал

Я пытался использовать tz.localize и tz.convert, которые хорошо работали вв прошлом, но я полагаю, что данные имели только один часовой пояс.Например, если я сделаю:

df['timestamp'].dt.tz_localize('MST', ambiguous='infer').dt.tz_convert('MST')

Я получу:

ValueError: Array must be all same time zone

During handling of the above exception, another exception occurred:

ValueError: Tz-aware datetime.datetime cannot be converted to datetime64 unless utc=True

Вопрос

Есть ли способ конвертировать их в MST?Или любой часовой пояс, правда?Я думаю, я мог бы разбить DataFrame по часовым поясам (не уверен на 100%, как, но я представляю, что это возможно) и действовать на куски этого, но я решил, что я хотел бы посмотреть, есть ли более разумное решение там.Спасибо!

Ответы [ 2 ]

2 голосов
/ 21 мая 2019

Я пытался:

df = pd.DataFrame({'timestamp':['2019-05-21 12:00:00-06:00',
                                '2019-05-21 12:15:00-07:00']})
df['timestamp'] = pd.to_datetime(df.timestamp)

df.timestamp.dt.tz_localize('MST')

отлично работает и дает:

0   2019-05-21 18:00:00-07:00
1   2019-05-21 19:15:00-07:00
Name: timestamp, dtype: datetime64[ns, MST]

Это не то, что вы ожидаете?


Редактировать: Благодаря @В комментарии Дж. Андерсона я пробовал разные данные с отметками времени с учетом часового пояса:

df = pd.DataFrame({'timestamp':[pd.to_datetime('2019-05-21 12:00:00').tz_localize('MST'),
                         pd.to_datetime('2019-05-21 12:15:00').tz_localize('EST')]})

, тогда

df['timestamp'] = pd.to_datetime(df.timestamp)

выдал ту же ошибку.Затем я добавил utc=True:

df.timestamp = pd.to_datetime(df.timestamp, utc=True)

# df.timestamp
# 0   2019-05-21 19:00:00+00:00
# 1   2019-05-21 17:15:00+00:00
# Name: timestamp, dtype: datetime64[ns, UTC]

df.timestamp.dt.tz_convert('MST')

отлично работает и дает:

0   2019-05-21 12:00:00-07:00
1   2019-05-21 10:15:00-07:00
Name: timestamp, dtype: datetime64[ns, MST]
1 голос
/ 21 мая 2019
# input data
import pandas as pd
series = pd.Series(data=
    [pd.to_datetime('2019-01-01 00:00:00').tz_localize('MST'),
     pd.to_datetime('2019-01-01 01:10:00').tz_localize('UTC')])
print(series)

дает

0    2019-01-01 00:00:00-07:00
1    2019-01-01 01:10:00+00:00
dtype: object

Действительно,

series.dt.tz_convert('MST')

дает "ValueError: массив должен быть все одного часового пояса" и "ValueError: Tz-осведомленный datetime.datetime не может быть преобразован в datetime64, если только utc = True ".Так что, похоже, вы должны сделать это не векторизованным способом:

new_series = pd.Series(index=series.index,
    data=[x.tz_convert('MST') for x in series])
print(new_series)

дает

0   2019-01-01 00:00:00-07:00
1   2018-12-31 18:10:00-07:00
dtype: datetime64[ns, MST]

Редактировать: если @QuangHoang прав (т.е. "опция автоматически локализует метки времени в utc ", дважды проверьте его!), что означает значение pd.to_datetime(..., utc=True), тогда будет работать и следующее решение:

new_series = pd.to_datetime(series, utc=True).dt.tz_convert('MST')
print(new_series)

дает

0   2019-01-01 00:00:00-07:00
1   2018-12-31 18:10:00-07:00
dtype: datetime64[ns, MST]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...