Глядя на источник из .map
, выясняется, что Панда проверяет, является ли тип Серии типом расширения .Как указывает OP, это будет вести себя по-разному для разных часовых поясов.Пусть
s1 = pd.Series([
pd.Timestamp(2018,5,11,6,0,0,0),
])
s2 = pd.Series([
pd.Timestamp(2018,5,11,6,0,0,0, pytz.timezone('UTC')),
])
Когда вызывается .map
, он проверяет pd.api.types.is_extension_type(s)
.Если s == s1
, возвращается False
, а если s == s2
- True
.
В результате s2.map
превращается в s2._values.map
.Поскольку s2._values
имеет тип DatetimeIndex
, вызывается соответствующая реализация .map
.Сначала он пытается вызвать f(s2._values)
и возвращается к s2._values.map(f)
в случае возникновения ошибки.
В этом случае f = lambda x: x.isoformat(x) if isinstance(x, pd.Timestamp) else x
.Ошибка не возникает, потому что f
проверяет, не завершено ли isinstance(s2._values, pd.Timestamp)
.Следовательно, f(s2._values)
возвращает s2._values
.В самом деле, это можно проверить с помощью s2._values is f(s2._values) == True
.
Один из обходных путей - убедиться, что pd.api.types.is_extension_type
не вызывается, например, s.astype(object).map
.