zoukankan      html  css  js  c++  java
  • 6-Pandas时间序列处理之时区处理(UTC查看、获取、时区意识型TimeStamp对象、本地化与转换、计算)

      通常选择使用协调世界时UTC,又称世界统一时间、世界标准时间、国际协调时间)来处理时间序列。

      时区以UTC偏移量的形式表示的。

      在Python中,时区信息来自第三方库pytz,Pandas包装了pytz功能。时区名可以在文档中找到,也可以用交互的方式查看。

      关于pytz模块的信息,可参考【python模块——pytz】

    (1)查看时区

      pytz有all_timezones、common_timezones这两个属性来查看有哪些时区

    >>> import pytz
    >>> len(pytz.common_timezones)
    440
    >>> pytz.common_timezones[:5]
    ['Africa/Abidjan', 'Africa/Accra', 'Africa/Addis_Ababa', 'Africa/Algiers', 'Africa/Asmara']
    >>> pytz.common_timezones[-5:]
    ['US/Eastern', 'US/Hawaii', 'US/Mountain', 'US/Pacific', 'UTC']
    
    >>> len(pytz.all_timezones)
    592
    >>> pytz.all_timezones[:5]
    ['Africa/Abidjan', 'Africa/Accra', 'Africa/Addis_Ababa', 'Africa/Algiers', 'Africa/Asmara']
    >>> pytz.all_timezones[-5:]
    ['UTC', 'Universal', 'W-SU', 'WET', 'Zulu']
    

     (2)获取时区对象

      pytz有timezone属性获取时区对象

    >>> tz = pytz.timezone('Asia/Shanghai')
    >>> tz
    <DstTzInfo 'Asia/Shanghai' LMT+8:06:00 STD>
    

     (3)查看时间序列的时区

      Pandas中的时间序列默认是naive时区,即没有时区。用index.tz方法查看时间序列的时区

    >>> rng = pd.date_range('2020/8/1',periods=5,freq='D')
    >>> ts
    2020-08-01    4
    2020-08-02    8
    2020-08-03    3
    2020-08-04    3
    2020-08-05    7
    Freq: D, dtype: int32
    >>> print(ts.index.tz)
    None
    

      通过参数tz可以设置时区

    >>> rng2 = pd.date_range('2020/8/1',periods=5,freq='D',tz='UTC')
    >>> ts2 = pd.Series(np.random.randint(1,10,len(rng2)),index = rng2)
    >>> ts2
    2020-08-01 00:00:00+00:00    8
    2020-08-02 00:00:00+00:00    3
    2020-08-03 00:00:00+00:00    1
    2020-08-04 00:00:00+00:00    3
    2020-08-05 00:00:00+00:00    2
    Freq: D, dtype: int32
    >>> print(ts2.index.tz)
    UTC
    

      (4)本地化和转换

      时间序列若需要和转化,必须先使用tz_localize进行时区本地化,再通过tz_convert()转换成别的时区

    #先进行本地化转换到别的地区
    >>> ts_utc = ts.tz_localize('UTC')
    >>> ts_utc.index
    DatetimeIndex(['2020-08-01 00:00:00+00:00', '2020-08-02 00:00:00+00:00',
                   '2020-08-03 00:00:00+00:00', '2020-08-04 00:00:00+00:00',
                   '2020-08-05 00:00:00+00:00'],
                  dtype='datetime64[ns, UTC]', freq='D')
    
    #再转换到别的时区
    >>> ts_utc.tz_convert('US/Eastern')
    2020-07-31 20:00:00-04:00    4
    2020-08-01 20:00:00-04:00    8
    2020-08-02 20:00:00-04:00    3
    2020-08-03 20:00:00-04:00    3
    2020-08-04 20:00:00-04:00    7
    Freq: D, dtype: int32
    

      DatetimeIndex日期索引对象也可以使用tz_localize()和tz_convert()方法

    >>> ts.index = ts.index.tz_localize('Asia/Shanghai')
    >>> ts
    2020-08-01 00:00:00+08:00    4
    2020-08-02 00:00:00+08:00    8
    2020-08-03 00:00:00+08:00    3
    2020-08-04 00:00:00+08:00    3
    2020-08-05 00:00:00+08:00    7
    Freq: D, dtype: int32
    

      (5)操作时区意识型TimeStamp对象

      与时间序列和日期范围一样,时间戳对象也能从naive本地化为时区意识型(time zone-aware),并从一个时区转换到另一个时区

     :创建一个时间戳本地化到世界标准时间UTC,并将时区转换为'US/Eastern'

    >>> stamp = pd.Timestamp('2020-8-1 18:23:34')
    >>> stamp_utc = stamp.tz_localize('UTC')
    >>> stamp_utc
    Timestamp('2020-08-01 18:23:34+0000', tz='UTC')
    >>> stamp_utc_convert = stamp_utc.tz_convert('US/Eastern')
    >>> stamp_utc_convert
    Timestamp('2020-08-01 14:23:34-0400', tz='US/Eastern')
    

      注意:时区意识型对象在内部保存了一个UTC时间戳,其值在时区转换过程中是不是发生改变的,是从1970年1月1日算起的纳秒数

    如:stamp_utc和stamp_utc_convert的值是一样的

    >>> stamp_utc_convert.value
    1596306214000000000
    >>> stamp_utc.value
    1596306214000000000
    

      (6)不同时区之间的计算

      当两个时间序列的时期不同,若需要将其合并,最后的结果将会是UTC

    >>> rng = pd.date_range('2020/8/1',periods=5,freq='D')
    >>> rng = pd.date_range('2020/8/1 10:30',periods=5,freq='D')
    >>> ts = pd.Series(np.random.randint(1,10,len(rng)),index = rng)
    >>> ts
    2020-08-01 10:30:00    8
    2020-08-02 10:30:00    1
    2020-08-03 10:30:00    9
    2020-08-04 10:30:00    9
    2020-08-05 10:30:00    3
    Freq: D, dtype: int32
    
    >>> ts1 = ts[:2].tz_localize('Europe/Zurich')
    >>> ts2 = ts[2:4].tz_localize('US/Arizona')
    >>> ts1.index
    DatetimeIndex(['2020-08-01 10:30:00+02:00', '2020-08-02 10:30:00+02:00'], dtype='datetime64[ns, Europe/Zurich]', freq='D')
    >>> result = ts1 + ts2
    >>> result
    2020-08-01 08:30:00+00:00   NaN
    2020-08-02 08:30:00+00:00   NaN
    2020-08-03 17:30:00+00:00   NaN
    2020-08-04 17:30:00+00:00   NaN
    dtype: float64
    >>> result.index
    DatetimeIndex(['2020-08-01 08:30:00+00:00', '2020-08-02 08:30:00+00:00',
                   '2020-08-03 17:30:00+00:00', '2020-08-04 17:30:00+00:00'],
                  dtype='datetime64[ns, UTC]', freq=None)
    

      

  • 相关阅读:
    SSH应用
    [数字信号处理]IIR滤波器的间接设计(C代码)
    C#调用ATL COM
    【deep learning学习笔记】最近读的几个ppt(未完...)
    程序中输出两位小数
    Exchange Server 2007 部署:安装时的 10 条提示
    中兴通讯变卖资产首季实现扭亏
    iPhone市场份额急跌 苹果亟需新产品确保市场地位
    如何做一个真正牛X 的开源项目
    提高PHP编程效率的53种方法
  • 原文地址:https://www.cnblogs.com/Cheryol/p/13479418.html
Copyright © 2011-2022 走看看