Времена, которые вы видите, действительно эквивалентны, но странным образом. Время Панд:
0 2018-10-27 14:00:00+02:00
1 2018-10-28 13:00:00+01:00
2 2018-10-29 13:00:00+01:00
dtype: datetime64[ns, Europe/Rome]
2018-10-28 03:00:00 было, когда летнее время закончилось в Риме. Pandas Series имеет только один логический часовой пояс, который применяется ко всем значениям - это сделано для экономии места и повышения производительности. Итак, ваш часовой пояс - Европа / Рим. Конечно, 14: 00: 00 + 02: 00 - это то же самое физическое время, что и 13: 00: 00 + 01: 00.
времена Python:
datetime.datetime(2018, 10, 27, 13, 0, tzinfo=<DstTzInfo 'Europe/Rome' CET+1:00:00 STD>)
datetime.datetime(2018, 10, 28, 13, 0, tzinfo=<DstTzInfo 'Europe/Rome' CET+1:00:00 STD>)
datetime.datetime(2018, 10, 29, 13, 0, tzinfo=<DstTzInfo 'Europe/Rome' CET+1:00:00 STD>)
Первый отличается тем, что Python использует неправильное временное смещение, то есть на самом деле это не Европа / Рим, потому что Рим в то время не был на CET. Это довольно странно и, возможно, менее правильно, чем то, что произвела Панда, поэтому немного неловко спрашивать: «Как заставить Панд делать то же [неправильное], что и Python?»
Но если вам нужно, вы можете:
timezone = pytz.FixedOffset(1)
Остальная часть кода остается прежней. Это говорит: «Смещение моего часового пояса всегда +1 час». Тогда Панды не заметят, когда DST включается и выключается:
0 2018-10-27 13:00:00+00:01
1 2018-10-28 13:00:00+00:01
2 2018-10-29 13:00:00+00:01
dtype: datetime64[ns, pytz.FixedOffset(1)]
Пользователи Python 3 могут вместо этого использовать встроенный datetime.timezone(1)
, но поскольку вы работаете на Python 2, pytz.FixedOffset(1)
выполняет свою работу.