#python #pandas #timezone
#python #pandas #Часовой пояс
Вопрос:
У Pandas Python есть возможность предоставлять регулярно разнесенные временные интервалы, используя (по крайней мере) date_range
функцию:
>>> import pandas as pd
>>> import pytz, datetime
>>> from pprint import pprint as pp
>>> tzto = pytz.timezone("America/Toronto")
>>> oct17 = tzto.localize(datetime.datetime(2014, 10, 17, 8))
>>> #get every Friday from Oct 17 (a Friday) for 5 weeks...
>>> pp(pd.date_range(oct17, periods=5, freq="W-FRI").tolist())
[Timestamp('2014-10-17 08:00:00-0400', tz='America/Toronto'),
Timestamp('2014-10-24 08:00:00-0400', tz='America/Toronto'),
Timestamp('2014-10-31 08:00:00-0400', tz='America/Toronto'),
Timestamp('2014-11-07 07:00:00-0500', tz='America/Toronto'),
Timestamp('2014-11-14 07:00:00-0500', tz='America/Toronto')]
К сожалению, начальное время теряется, когда интервал охватывает изменение летнего времени. Это можно увидеть выше, где последние две записи выше перенесены на 7 утра из-за запланированного изменения летнего времени в Торонто 2 ноября 2014 года.
Как можно построить ряд, чтобы время оставалось одинаковым через границу летнего времени? т.Е.: В приведенном выше примере для каждой записи выше должно быть 8 утра, вместо того, чтобы переходить на 7 утра после перехода в летнее время.
Ответ №1:
Для этого начальная дата-время должна быть наивной. Локализуйте часовой пояс после создания ряда, передав tz
аргумент ключевого слова в date_range()
:
>>> import pandas as pd
>>> import pytz, datetime
>>> from pprint import pprint as pp
>>> tzto = pytz.timezone("America/Toronto")
>>> oct17_naive = datetime.datetime(2014, 10, 17, 8, 0, 0)
>>> pp(pd.date_range(oct17_naive, periods=5, freq="W-FRI", tz=tzto).tolist())
[Timestamp('2014-10-17 08:00:00-0400', tz='America/Toronto'),
Timestamp('2014-10-24 08:00:00-0400', tz='America/Toronto'),
Timestamp('2014-10-31 08:00:00-0400', tz='America/Toronto'),
Timestamp('2014-11-07 08:00:00-0500', tz='America/Toronto'),
Timestamp('2014-11-14 08:00:00-0500', tz='America/Toronto')]
Все время, указанное выше, в 8 утра, даже при переходе на летнее время 2 ноября.