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]