11.4 时区处理
处理时区通常是时间序列操作中最不愉快的部分。因此,很多时间序列用户选择世界协调时间或UTC,它是格林尼治时间的后继者,也是目前的国际标准。时区通常被表示为UTC的偏置,例如,在夏令时期间,纽约比UTC时间晚4个小时,其余时间晚5个小时。
在Python语言中,时区信息来源于第三方库pytz(可以使用pip或conda安装),其中公开了Olson数据库,这是世界时区信息的汇编。这对于历史数据尤为重要,因为夏令时(DST)转换日期(甚至是UTC偏移量)已经根据地方政府的意愿而改变了很多次。在美国,DST转换时间从1900至今已经多次变更!
如果需要关于pytz库的更多细节信息,你需要查看该库的官方文档。本书目前的内容中,pandas封装了pytz的功能,因此你可以忽略pytz时区名称以外的API。
注:pandas中的方法可以接收时区名称或时区对象
11.4.1 时区的本地化和转换
1.默认情况下,pandas中的时间序列是时区简单型的(见图11-2)
2.使用tz_localize方法从简单时区转换到本地化时区(见图11-3)
3.一旦时间序列被本地化为某个特定的时区,则可以通过tz_convert将其转换为另一个时区(见图11-4)
4.在之前的跨越America/New-York时区的DST转换时间序列的例子中,我们可以将其本地化到EST并转换为UTC或柏林时间(见图11-5)
5.DatetimeIndex示例(见图11-6)
注: 简单时间戳的本地化也会检查夏时制转换周围的模糊或不存在的时间
11.4.2 时区感知时间戳对象的操作
1.与时间序列和日期范围类似,单独的Timestamp对象也可以从简单时间戳本地化为时区感知时间戳,并从一个时区转换为另一个时区(见图11-7)
2.时区感知的Timestamp对象内部存储了一个Unix纪元(1970年1月1日)至今的纳秒数量UTC时间戳数值,该数值在时区转换中是不变(见图11-8)
3.在使用pandas的DateOffset进行时间算术时,pandas尽可能遵从夏时制。这里我们构建恰好在DST转换之前发生的时间戳(向前和向后)(见图11-9)
11.4.3 不同时区间的操作
如果两个时区不同的时间序列需要联合,那么结果将是UTC时间的。由于时间戳以UTC格式存储,这是一个简单的操作,不需要转换(见图11-10)