Панды: добавление смещения TimeZone к отметке времени после использования tz_convert - PullRequest
0 голосов
/ 09 апреля 2019

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

      feed_id                created_at
7191  1009408 2019-03-10 01:55:35-05:00
7192  1009408 2019-03-10 01:56:35-05:00
7193  1009408 2019-03-10 01:57:36-05:00
7194  1009408 2019-03-10 01:58:38-05:00
7195  1009408 2019-03-10 01:59:38-05:00
7196  1009408 2019-03-10 03:00:39-04:00
7197  1009408 2019-03-10 03:01:40-04:00
7198  1009408 2019-03-10 03:02:41-04:00
7199  1009408 2019-03-10 03:03:42-04:00

Я попал сюда с помощью:

mydf['created_at']=mydf['created_at'].dt.tz_localize('UTC').dt.tz_convert('America/Montreal')

Я хочу, чтобы время смещения было добавлено к отметке времени, если дата выглядит как 2019-03-10 01:55:35-05: 00, я хочу, чтобы это выглядело как 2019-03-09 20:55:35.

Я увидел предложение на в этом посте , что мысль помогла бы мне, но добавляемое смещение является постоянным, и я хочу рассмотреть DST для этого упражнения.

Есть ли способ получить "временную дельту с учетом часовых поясов" или смещение, учитывающее летнее время?

Или есть более простой способ добиться этого?

1 Ответ

0 голосов
/ 09 апреля 2019

Вот один из способов, который заключается в том, чтобы разбить Datetime.datetime объекты в created_at и восстановить.Вероятно, есть лучшие способы, особенно те, которые не идут после tzoffset._offset.

import pandas as pd
from pandas.compat import StringIO

csvdata = StringIO("""id,feed_id,created_at
7191,1009408,2019-03-10 01:55:35-05:00
7192,1009408,2019-03-10 01:56:35-05:00
7193,1009408,2019-03-10 01:57:36-05:00
7194,1009408,2019-03-10 01:58:38-05:00
7195,1009408,2019-03-10 01:59:38-05:00
7196,1009408,2019-03-10 03:00:39-04:00
7197,1009408,2019-03-10 03:01:40-04:00
7198,1009408,2019-03-10 03:02:41-04:00
7199,1009408,2019-03-10 03:03:42-04:00""")

df = pd.read_csv(csvdata, sep=",", index_col="id", parse_dates=True, infer_datetime_format=True)
df['created_at'] = pd.to_datetime(df['created_at'])
df['offset'] = df['created_at'].apply(lambda x: x.tzinfo)
df['naive'] = df['created_at'].apply(lambda x: x.replace(tzinfo=None))
# tzoffset._offset is a timedelta
df['naive and offset'] = df['naive'] + df['offset'].apply(lambda x: x._offset)
print(df)
...