在python中时区的处理由第三方模块pytz提供。
datetime时区转换
- 默认初始化的datetime类型是不带有时区信息的
from datetime import datetime,timedelta
d1 = datetime(2019,1,1,9,30)
datetime.datetime(2019, 1, 1, 9, 30)
print(d1.tzinfo)
None
- 创建时区对象
tz_utc = timezone('utc')
tz_loc = timezone('Asia/ShangHai')
<DstTzInfo 'Asia/Shanghai' LMT+8:06:00 STD>
- 设置datetime为指定的时区localize
d2 = tz_utc.localize(d1) #设置为utc时区
datetime.datetime(2019, 1, 1, 9, 30, tzinfo=<UTC>)
4.将datetime转换为指定的时区astimezone
d2.astimezone(tz_loc)
datetime.datetime(2019, 1, 1, 17, 30, tzinfo=<DstTzInfo 'Asia/Shanghai' CST+8:00:00 STD>)
pandas中的时区处理
时间序列
默认pandas中的时间序列是简单类型,它并不含时区信息。(这点和datetime类型一样)
rng = pd.date_range('20120309 09:30',periods=6,freq='D')
DatetimeIndex(['2012-03-09 09:30:00', '2012-03-10 09:30:00',
'2012-03-11 09:30:00', '2012-03-12 09:30:00',
'2012-03-13 09:30:00', '2012-03-14 09:30:00'],
dtype='datetime64[ns]', freq='D')
ts = pd.Series(np.random.randn(len(rng)),index = rng)
print(ts.index.tz)
None
指定时区创建时间序列
pd.date_range('20120309 09:30',periods=10,freq='D',tz='UTC')
DatetimeIndex(['2012-03-09 09:30:00+00:00', '2012-03-10 09:30:00+00:00',
'2012-03-11 09:30:00+00:00', '2012-03-12 09:30:00+00:00',
'2012-03-13 09:30:00+00:00', '2012-03-14 09:30:00+00:00'],
dtype='datetime64[ns, UTC]', freq='D')
设置时区,并转为成其他的时区
创建时间序列
ts = pd.Series(np.random.randn(6),index=pd.date_range('20190101',periods=6))
2019-01-01 -0.946268
2019-01-02 -1.371671
2019-01-03 -1.327071
2019-01-04 -0.369434
2019-01-05 1.379586
2019-01-06 -0.280945
Freq: D, dtype: float64
创建时区
utc = timezone('utc')
asia = timezone('Asia/ShangHai')
将ts设定为指定的时区
ts = ts.tz_localize(utc)
2019-01-01 00:00:00+00:00 -0.946268
2019-01-02 00:00:00+00:00 -1.371671
2019-01-03 00:00:00+00:00 -1.327071
2019-01-04 00:00:00+00:00 -0.369434
2019-01-05 00:00:00+00:00 1.379586
2019-01-06 00:00:00+00:00 -0.280945
Freq: D, dtype: float64
转换为指定的时区
ts = ts.tz_convert(asia)
2019-01-01 08:00:00+08:00 -0.946268
2019-01-02 08:00:00+08:00 -1.371671
2019-01-03 08:00:00+08:00 -1.327071
2019-01-04 08:00:00+08:00 -0.369434
2019-01-05 08:00:00+08:00 1.379586
2019-01-06 08:00:00+08:00 -0.280945
Freq: D, dtype: float64
Timestamp时区转换
stamp = pd.Timestamp('20110312 04:00')
Timestamp('2011-03-12 04:00:00')
stamp_utc = stamp.tz_localize('utc')
Timestamp('2011-03-12 04:00:00+0000', tz='UTC')
stamp_loc=stamp_utc.tz_convert('Asia/ShangHai')
Timestamp('2011-03-12 12:00:00+0800', tz='Asia/Shanghai')
TimeStamp存储了一个19700101到当前时间的纳秒数,当时区转换的时候,这个数是不会变化的。
时区不同的Series的操作会转换为UTC
ts = pd.Series(np.random.randn(10),index=pd.date_range('20120307 09:30',periods=10,freq='B'))
2012-03-07 09:30:00 -0.741151
2012-03-08 09:30:00 -0.248209
2012-03-09 09:30:00 0.879398
2012-03-12 09:30:00 1.872593
2012-03-13 09:30:00 0.790101
2012-03-14 09:30:00 3.042974
2012-03-15 09:30:00 -0.795131
2012-03-16 09:30:00 -0.442138
2012-03-19 09:30:00 0.320051
2012-03-20 09:30:00 0.205048
Freq: B, dtype: float64
ts1 = ts[:7].tz_localize('Asia/ShangHai')
2012-03-07 09:30:00+08:00 -0.741151
2012-03-08 09:30:00+08:00 -0.248209
2012-03-09 09:30:00+08:00 0.879398
2012-03-12 09:30:00+08:00 1.872593
2012-03-13 09:30:00+08:00 0.790101
2012-03-14 09:30:00+08:00 3.042974
2012-03-15 09:30:00+08:00 -0.795131
ts2 = ts1[2:].tz_convert('Europe/Moscow')
2012-03-09 05:30:00+04:00 0.879398
2012-03-12 05:30:00+04:00 1.872593
2012-03-13 05:30:00+04:00 0.790101
2012-03-14 05:30:00+04:00 3.042974
2012-03-15 05:30:00+04:00 -0.795131
Freq: B, dtype: float64
res = ts1+ts2
2012-03-07 01:30:00+00:00 NaN
2012-03-08 01:30:00+00:00 NaN
2012-03-09 01:30:00+00:00 1.758796
2012-03-12 01:30:00+00:00 3.745185
2012-03-13 01:30:00+00:00 1.580203
2012-03-14 01:30:00+00:00 6.085947
2012-03-15 01:30:00+00:00 -1.590263