看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
pandas 使用 pytz 和 dateutil 库或标准库中的类 datetime.timezone 对象为使用不同时区的时间戳提供了丰富的支持。
以下其中任何一个变量可以看所有的时间名称,中国通用的北京时区使用 'Asia/Shanghai'
定义。
from pytz import common_timezones, all_timezone
print(common_timezones)
print(all_timezones)
在没有指定时区时,没不带时区的:
rng = pd.date_range('3/6/2012 00:00', periods=15, freq='D')
rng.tz is None
# True
简单的时区指定:
pd.date_range('2019-01-01', periods=3, freq='D', tz='US/Pacific')
pd.Timestamp('2019-01-01', tz='US/Pacific')
以下是指定时区的更多方法:
import dateutil
# 使用 pytz 支持
rng_pytz = pd.date_range('3/6/2012 00:00', periods=3,
freq='D', tz='Europe/London')
rng_pytz.tz
# <DstTzInfo 'Europe/London' LMT-1 day, 23:59:00 STD>
# 使用 dateutil 支持
rng_dateutil = pd.date_range('3/6/2012 00:00', periods=3, freq='D')
# 转为伦敦所在的时区
rng_dateutil = rng_dateutil.tz_localize('dateutil/Europe/London')
rng_dateutil.tz
# tzfile('/usr/share/zoneinfo/Europe/London')
# dateutil 指定为 utc 时间
rng_utc = pd.date_range('3/6/2012 00:00', periods=3,
freq='D', tz=dateutil.tz.tzutc())
rng_utc.tz
# tzutc()
# datetime.timezone
rng_utc = pd.date_range('3/6/2012 00:00', periods=3,
freq='D', tz=datetime.timezone.utc)
rng_utc.tz
# datetime.timezone.utc
请注意,UTC 时区是 dateutil 中的特殊情况,应显式构造为 dateutil.tz.tzutc 的实例。
还可以首先显式构造其他时区对象:
# pytz
tz_pytz = pytz.timezone('Europe/London')
rng_pytz = pd.date_range('3/6/2012 00:00', periods=3, freq='D')
rng_pytz = rng_pytz.tz_localize(tz_pytz)
rng_pytz.tz == tz_pytz
# True
# dateutil
tz_dateutil = dateutil.tz.gettz('Europe/London')
rng_dateutil = pd.date_range('3/6/2012 00:00', periods=3,
freq='D', tz=tz_dateutil)
ng_dateutil.tz == tz_dateutil
# True
要将时区感知的 Pandas 对象从一个时区转换为另一个时区,可以使用 tz_convert 方法。
rng_pytz.tz_convert('US/Eastern')
'''
DatetimeIndex(['2012-03-05 19:00:00-05:00', '2012-03-06 19:00:00-05:00',
'2012-03-07 19:00:00-05:00'],
dtype='datetime64[ns, US/Eastern]', freq='D')
'''
可以在转换类型时指定:
pd.Series('20210101').astype('datetime64[ns, Asia/Shanghai]')
'''
0 2021-01-01 00:00:00+08:00
dtype: datetime64[ns, Asia/Shanghai]
'''
tz_localize 可能无法确定时间戳的 UTC 偏移量,因为本地时区中的夏时制(DST)导致一天中的某些时间发生两次(“时钟倒退”)。 提供以下选项:
rng_hourly = pd.DatetimeIndex(['11/06/2011 00:00', '11/06/2011 01:00',
'11/06/2011 01:00', '11/06/2011 02:00'])
rng_hourly.tz_localize('US/Eastern')
# AmbiguousTimeError: Cannot infer dst time from 2011-11-06 01:00:00, try using the 'ambiguous' argument
通过指定以下内容来处理这些模糊的时间:
rng_hourly.tz_localize('US/Eastern', ambiguous='infer')
'''
DatetimeIndex(['2011-11-06 00:00:00-04:00', '2011-11-06 01:00:00-04:00',
'2011-11-06 01:00:00-05:00', '2011-11-06 02:00:00-05:00'],
dtype='datetime64[ns, US/Eastern]', freq=None)
'''
rng_hourly.tz_localize('US/Eastern', ambiguous='NaT')
'''
DatetimeIndex(['2011-11-06 00:00:00-04:00', 'NaT', 'NaT',
'2011-11-06 02:00:00-05:00'],
dtype='datetime64[ns, US/Eastern]', freq=None)
'''
rng_hourly.tz_localize('US/Eastern', ambiguous=[True, True, False, False])
'''
DatetimeIndex(['2011-11-06 00:00:00-04:00', '2011-11-06 01:00:00-04:00',
'2011-11-06 01:00:00-05:00', '2011-11-06 02:00:00-05:00'],
dtype='datetime64[ns, US/Eastern]', freq=None)
'''
DST转换也可能会将本地时间提前1小时,从而创建不存在的本地时间(“时钟往前跳”)。 可以通过不存在的参数来控制使用不存在的时间对时间序列进行本地化的行为。 提供以下选项:
dti = pd.date_range(start='2015-03-29 02:30:00', periods=3, freq='H')
# 2:30 is a nonexistent time
默认情况下,不存在时间的本地化将引发错误。
dti.tz_localize('Europe/Warsaw')
# NonExistentTimeError: 2015-03-29 02:30:00
将不存在的时间转换为NaT或移动时间:
dti
'''
DatetimeIndex(['2015-03-29 02:30:00', '2015-03-29 03:30:00',
'2015-03-29 04:30:00'],
dtype='datetime64[ns]', freq='H')
'''
dti.tz_localize('Europe/Warsaw', nonexistent='shift_forward')
'''
DatetimeIndex(['2015-03-29 03:00:00+02:00', '2015-03-29 03:30:00+02:00',
'2015-03-29 04:30:00+02:00'],
dtype='datetime64[ns, Europe/Warsaw]', freq='H')
'''
dti.tz_localize('Europe/Warsaw', nonexistent='shift_backward')
'''
DatetimeIndex(['2015-03-29 01:59:59.999999999+01:00',
'2015-03-29 03:30:00+02:00',
'2015-03-29 04:30:00+02:00'],
dtype='datetime64[ns, Europe/Warsaw]', freq='H')
'''
dti.tz_localize('Europe/Warsaw', nonexistent=pd.Timedelta(1, unit='H'))
'''
DatetimeIndex(['2015-03-29 03:30:00+02:00', '2015-03-29 03:30:00+02:00',
'2015-03-29 04:30:00+02:00'],
dtype='datetime64[ns, Europe/Warsaw]', freq='H')
'''
dti.tz_localize('Europe/Warsaw', nonexistent='NaT')
'''
DatetimeIndex(['NaT', '2015-03-29 03:30:00+02:00',
'2015-03-29 04:30:00+02:00'],
dtype='datetime64[ns, Europe/Warsaw]', freq='H')
'''
指定时区:
s_naive = pd.Series(pd.date_range('20130101', periods=3))
# dtype: datetime64[ns]
s_aware = pd.Series(pd.date_range('20130101', periods=3, tz='US/Eastern'))
# dtype: datetime64[ns, US/Eastern]
时区转换:
s_naive.dt.tz_localize('UTC').dt.tz_convert('US/Eastern')
s_naive.astype('datetime64[ns, US/Eastern]')
s_aware.to_numpy(dtype='datetime64[ns]')
更新时间:2020-06-24 22:59:25 标签:pandas 时间 时区