打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Pandas时间序列:时区处理
import pandas as pdimport numpy as np

一、基本概念介绍

  • UTC:协调世界时,全世界唯一的统一时间;
  • DST:夏令时,即不同国家不同地区的时间是不同的;
  • 时区是以UTC偏移量的形式表示的。例如,夏令时期间,纽约比UTC慢4小时,而全年其他时间比UTC慢5小时;

二、Python中的时区第三方库pytz

import pytz

1.通过common_timezone可以获得所有时区的名称

pytz.common_timezones[-5:]
['US/Eastern', 'US/Hawaii', 'US/Mountain', 'US/Pacific', 'UTC']

2.通过timezone可以获取时间对象

tz = pytz.timezone('US/Eastern')tz
<DstTzInfo 'US/Eastern' LMT-1 day, 19:04:00 STD>

三、本地化和转换

1.pandas中的时间序列默认是naive时区,也就是没有时区的

rng = pd.date_range('3/9/2018 22:29',periods=5,freq='D') # 生成范围日期时可以加上时区信息ts = pd.Series(np.random.randn(len(rng)),index=rng)ts
2018-03-09 22:29:00   -0.4222592018-03-10 22:29:00   -0.4115702018-03-11 22:29:00    0.4996412018-03-12 22:29:00    0.8911932018-03-13 22:29:00   -0.966908Freq: D, dtype: float64

2.通过tz_localize方法可以为没有时区的时间序列赋予时区

ts_utc = ts.tz_localize('UTC')ts_utc
2018-03-09 22:29:00+00:00   -0.4222592018-03-10 22:29:00+00:00   -0.4115702018-03-11 22:29:00+00:00    0.4996412018-03-12 22:29:00+00:00    0.8911932018-03-13 22:29:00+00:00   -0.966908Freq: D, dtype: float64

3.一旦时间序列被本地化到某个特定时区,就可以用tz_convert将其转换到别的时区了

ts_eastern = ts_utc.tz_convert('US/Eastern')ts_eastern
2018-03-09 17:29:00-05:00   -0.4222592018-03-10 17:29:00-05:00   -0.4115702018-03-11 18:29:00-04:00    0.4996412018-03-12 18:29:00-04:00    0.8911932018-03-13 18:29:00-04:00   -0.966908Freq: D, dtype: float64
ts_eastern.tz_convert('UTC')
2018-03-09 22:29:00+00:00   -0.4222592018-03-10 22:29:00+00:00   -0.4115702018-03-11 22:29:00+00:00    0.4996412018-03-12 22:29:00+00:00    0.8911932018-03-13 22:29:00+00:00   -0.966908Freq: D, dtype: float64

4.tz_localize和tz_convert也是DatetimeIndex的实例方法

ts.index.tz_localize('Asia/Shanghai')
DatetimeIndex(['2018-03-09 22:29:00+08:00', '2018-03-10 22:29:00+08:00',               '2018-03-11 22:29:00+08:00', '2018-03-12 22:29:00+08:00',               '2018-03-13 22:29:00+08:00'],              dtype='datetime64[ns, Asia/Shanghai]', freq='D')

四、操作时区意识型(time zone-aware)Timestamp对象

1.Timestamp对象也能被从navie本地化为时区意识型(time zone-aware)

stamp = pd.Timestamp('2018-7-5 22:40')stamp
Timestamp('2018-07-05 22:40:00')
stamp_utc = stamp.tz_localize('utc')

2.创建Timestamp时,还可以传入一个时区信息

stamp_moscow = pd.Timestamp('2018-7-5 22:41',tz='Europe/Moscow')stamp_moscow
Timestamp('2018-07-05 22:41:00+0300', tz='Europe/Moscow')

3.时区意识型Timestamp对象内部保存了一个utc时间戳值,这个值在时区的转换过程中是不会变化的

print(stamp_utc.value)print(stamp_utc.tz_convert('US/Eastern').value)
15308304000000000001530830400000000000

4.当使用日期偏移量执行计算时,运算过程会自动关注是否存在夏令时转变期

from pandas.tseries.offsets import Hour
stamp = pd.Timestamp('2012-03-12 01:30',tz='US/Eastern')print(stamp)print(stamp+Hour()) # 不涉及夏令时转变期
2012-03-12 01:30:00-04:002012-03-12 02:30:00-04:00
stamp = pd.Timestamp('2012-11-04 00:30',tz='US/Eastern')print(stamp)print(stamp+Hour(2)) # 涉及夏令时转变期
2012-11-04 00:30:00-04:002012-11-04 01:30:00-05:00

五、不同时区之间的运算

两个时间序列的时区不同,在将它们合并到一起时,最终结果就会是UTC。

rng = pd.date_range('7/5/2018 22:50',periods=10,freq='B')ts = pd.Series(np.random.randn(len(rng)),index=rng)
ts1 = ts[:7].tz_localize('Europe/London')ts2 = ts1[2:].tz_convert('Europe/Moscow')
ts1
2018-07-05 22:50:00+01:00    0.8162652018-07-06 22:50:00+01:00   -0.5162422018-07-09 22:50:00+01:00    0.3591662018-07-10 22:50:00+01:00   -2.2383962018-07-11 22:50:00+01:00   -1.5163652018-07-12 22:50:00+01:00   -1.7348322018-07-13 22:50:00+01:00   -0.063531Freq: B, dtype: float64
ts2
2018-07-10 00:50:00+03:00    0.3591662018-07-11 00:50:00+03:00   -2.2383962018-07-12 00:50:00+03:00   -1.5163652018-07-13 00:50:00+03:00   -1.7348322018-07-14 00:50:00+03:00   -0.063531Freq: B, dtype: float64
result = ts1 + ts2result
2018-07-05 21:50:00+00:00         NaN2018-07-06 21:50:00+00:00         NaN2018-07-09 21:50:00+00:00    0.7183322018-07-10 21:50:00+00:00   -4.4767922018-07-11 21:50:00+00:00   -3.0327312018-07-12 21:50:00+00:00   -3.4696632018-07-13 21:50:00+00:00   -0.127062Freq: B, dtype: float64
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
掌握Pandas时间序列分析的20个知识点
Pandas 中最常用的 7 个时间戳处理函数
MySQL关于timestamp和mysqldump的一个“bug”
python的常用内建模块与常用第三方模块
pandas小记:pandas时间序列分析和处理Timeseries
Python学习教程_Python学习路线:Pandas库分析-时间序列的处理
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服