pandas.Series.dt.tz_localize#
- Series.dt.tz_localize(*args, **kwargs)[源代码]#
将时区未知的日期时间数组/索引本地化为时区已知的日期时间数组/索引。
此方法接受一个时区(tz)天真的 Datetime 数组/索引对象,并使其具有时区意识。它不会将时间移动到另一个时区。
此方法还可以用于做相反的事情——从已知对象创建一个时区未知对象。为此,传递 tz=None。
- 参数:
- tzstr, zoneinfo.ZoneInfo, pytz.timezone, dateutil.tz.tzfile, datetime.tzinfo 或 None
要转换时间戳的时区。传递
None
将删除时区信息,保留本地时间。- 模棱两可‘infer’, ‘NaT’, bool 数组, 默认 ‘raise’
当由于夏令时(DST)时钟回拨时,可能会出现不明确的时间。例如在中欧时间(UTC+01),当从夏令时03:00变为非夏令时02:00时,本地时间02:30:00在UTC时间00:30:00和01:30:00都会出现。在这种情况下,`ambiguous`参数决定了如何处理不明确的时间。
‘infer’ 将尝试根据顺序推断出 dst-transition 小时
bool-ndarray,其中 True 表示夏令时,False 表示非夏令时(请注意,此标志仅适用于不明确的时间)
‘NaT’ 将在存在模糊时间的地方返回 NaT
‘raise’ 如果存在歧义时间,将引发 ValueError。
- nonexistent‘shift_forward’, ‘shift_backward, ‘NaT’, timedelta, 默认 ‘raise’
在一个特定时区中,由于夏令时导致时钟向前移动,不存在的时间在这个时区中是不存在的。
‘shift_forward’ 会将不存在的时刻向前移动到最近的现有时刻
‘shift_backward’ 会将不存在的时间向后移动到最近的现有时间
‘NaT’ 将在不存在的时间处返回 NaT
timedelta 对象会将不存在的时间按 timedelta 进行调整
‘raise’ 如果存在不存在的时间,将引发 ValueError。
- 返回:
- 与自身相同类型
数组/索引转换为指定时区。
- 引发:
- TypeError
如果 Datetime 数组/索引是时区感知的并且 tz 不是 None。
参见
DatetimeIndex.tz_convert
将 tz-aware DatetimeIndex 从一个时区转换到另一个时区。
例子
>>> tz_naive = pd.date_range('2018-03-01 09:00', periods=3) >>> tz_naive DatetimeIndex(['2018-03-01 09:00:00', '2018-03-02 09:00:00', '2018-03-03 09:00:00'], dtype='datetime64[ns]', freq='D')
将 DatetimeIndex 本地化为 US/Eastern 时区:
>>> tz_aware = tz_naive.tz_localize(tz='US/Eastern') >>> tz_aware DatetimeIndex(['2018-03-01 09:00:00-05:00', '2018-03-02 09:00:00-05:00', '2018-03-03 09:00:00-05:00'], dtype='datetime64[ns, US/Eastern]', freq=None)
使用
tz=None
,我们可以在保持本地时间的同时(不转换为UTC)移除时区信息:>>> tz_aware.tz_localize(None) DatetimeIndex(['2018-03-01 09:00:00', '2018-03-02 09:00:00', '2018-03-03 09:00:00'], dtype='datetime64[ns]', freq=None)
注意DST的变化。当有连续数据时,pandas可以推断DST时间:
>>> s = pd.to_datetime(pd.Series(['2018-10-28 01:30:00', ... '2018-10-28 02:00:00', ... '2018-10-28 02:30:00', ... '2018-10-28 02:00:00', ... '2018-10-28 02:30:00', ... '2018-10-28 03:00:00', ... '2018-10-28 03:30:00'])) >>> s.dt.tz_localize('CET', ambiguous='infer') 0 2018-10-28 01:30:00+02:00 1 2018-10-28 02:00:00+02:00 2 2018-10-28 02:30:00+02:00 3 2018-10-28 02:00:00+01:00 4 2018-10-28 02:30:00+01:00 5 2018-10-28 03:00:00+01:00 6 2018-10-28 03:30:00+01:00 dtype: datetime64[s, CET]
在某些情况下,推断DST是不可能的。在这种情况下,你可以传递一个ndarray到ambiguous参数来显式设置DST。
>>> s = pd.to_datetime(pd.Series(['2018-10-28 01:20:00', ... '2018-10-28 02:36:00', ... '2018-10-28 03:46:00'])) >>> s.dt.tz_localize('CET', ambiguous=np.array([True, True, False])) 0 2018-10-28 01:20:00+02:00 1 2018-10-28 02:36:00+02:00 2 2018-10-28 03:46:00+01:00 dtype: datetime64[s, CET]
如果夏令时转换导致不存在的时间,您可以使用 timedelta 对象或 ‘shift_forward’ 或 ‘shift_backwards’ 将这些日期向前或向后移动。
>>> s = pd.to_datetime(pd.Series(['2015-03-29 02:30:00', ... '2015-03-29 03:30:00'], dtype="M8[ns]")) >>> s.dt.tz_localize('Europe/Warsaw', nonexistent='shift_forward') 0 2015-03-29 03:00:00+02:00 1 2015-03-29 03:30:00+02:00 dtype: datetime64[ns, Europe/Warsaw]
>>> s.dt.tz_localize('Europe/Warsaw', nonexistent='shift_backward') 0 2015-03-29 01:59:59.999999999+01:00 1 2015-03-29 03:30:00+02:00 dtype: datetime64[ns, Europe/Warsaw]
>>> s.dt.tz_localize('Europe/Warsaw', nonexistent=pd.Timedelta('1h')) 0 2015-03-29 03:30:00+02:00 1 2015-03-29 03:30:00+02:00 dtype: datetime64[ns, Europe/Warsaw]