pandas中的时区
默认情况下,pandas中的时间序列是单纯的(naive)时区
import pandas as pd
import numpy as np
rng = pd.date_range('3/9/2012 9:30', periods=6, freq='D')
ts = pd.Series(np.random.randn(len(rng)), index=rng)
print(ts.index.tz)
None
可知,索引的tz字段为None
在生成日期范围时可以加上一个时区信息
pd.date_range('3/9/2012 9:30', periods=6, 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')
从单纯到本地化的转换可以通过tz_localize方法得到:
ts_utc = ts.tz_localize('UTC')
ts_utc
2012-03-09 09:30:00+00:00 -1.113673
2012-03-10 09:30:00+00:00 -0.173151
2012-03-11 09:30:00+00:00 -0.378811
2012-03-12 09:30:00+00:00 -0.046063
2012-03-13 09:30:00+00:00 -0.502198
2012-03-14 09:30:00+00:00 1.377570
Freq: D, dtype: float64
ts_utc8 = ts.tz_localize('Asia/Shanghai')
ts_utc8
2012-03-09 09:30:00+08:00 -1.113673
2012-03-10 09:30:00+08:00 -0.173151
2012-03-11 09:30:00+08:00 -0.378811
2012-03-12 09:30:00+08:00 -0.046063
2012-03-13 09:30:00+08:00 -0.502198
2012-03-14 09:30:00+08:00 1.377570
Freq: D, dtype: float64
可以看到,通过此方法将单纯时区本地化,时间并没有相差8小时,只是加上了对应的时区
一旦时间序列被本地化到某个固定特定时区,就可以用tz_convert将其转化到别的时区了:
ts_utc.tz_convert('US/Eastern')
2012-03-09 04:30:00-05:00 -1.113673
2012-03-10 04:30:00-05:00 -0.173151
2012-03-11 05:30:00-04:00 -0.378811
2012-03-12 05:30:00-04:00 -0.046063
2012-03-13 05:30:00-04:00 -0.502198
2012-03-14 05:30:00-04:00 1.377570
Freq: D, dtype: float64
python中的时区
from datetime import datetime, timezone, timedelta
创建时区UTC+00:00
tz_utc = timezone(timedelta(hours=0))
current_utc_time = datetime.utcnow().replace(tzinfo=tz_utc)
print('current_utc_time:', current_utc_time)
current_utc_time: 2019-11-03 15:57:21.932893+00:00
可以看到具有时区信息
创建时区UTC+08:00
print('local time is :', datetime.now())
tz_utc8 = timezone(timedelta(hours=8))
current_utc8_time = datetime.now().replace(tzinfo=tz_utc8)
print('current_utc8_time:', current_utc8_time)
local time is : 2019-11-04 00:00:37.748456
current_utc8_time: 2019-11-04 00:00:37.748957+08:00
可以看到,将本地时间加上了时区信息,而时间并没有改变
设置系统变量
import os
os.environ['TZ'] = 'Asia/Shanghai'
获取系统变量,并获取系统时间
system_env = os.getenv('TZ')
current_system_time = datetime.now()
print('system tzinfo is ', system_env)
print('system time is ', current_system_time)
system tzinfo is Asia/Shanghai
system time is 2019-11-04 00:05:54.926437
可以看到,通过设置系统时区变量,获取到的时间并没有时区信息,只是设置了系统时间
即:当系统中设置了环境变量 TZ 的时候,或者在python中设置了os.environ[‘TZ’] 的时候,上面的函数获取的时间便是TZ对应时区的时间,其实这里可以认为 TZ 影响的不是这些函数,而是影响的系统时间
os.environ['TZ'] = 'UTC'
current_system_time = datetime.now()
system_env = os.getenv('TZ')
print('system tzinfo is ', system_env)
print('system time is ', current_system_time)
system tzinfo is UTC
system time is 2019-11-04 00:13:00.620696
获取系统时区
import time
s = time.strftime('%z', time.localtime())
print(s)
+0800
时间添加时区
from pytz import timezone
cst_tz = timezone('Asia/Shanghai')
第一种方式
datetime.now(cst_tz)
datetime.datetime(2019, 11, 4, 0, 18, 37, 783670, tzinfo=<DstTzInfo 'Asia/Shanghai' CST+8:00:00 STD>)
第二种方式
now = datetime.now()
print(now)
now.astimezone(cst_tz)
2019-11-04 00:20:05.403869
datetime.datetime(2019, 11, 4, 0, 20, 5, 403869, tzinfo=<DstTzInfo 'Asia/Shanghai' CST+8:00:00 STD>)
第三种方式
from datetime import timezone
datetime.now().replace(tzinfo=timezone.utc).astimezone(timezone(timedelta(hours=8)))
datetime.datetime(2019, 11, 4, 8, 23, 46, 778456, tzinfo=datetime.timezone(datetime.timedelta(0, 28800)))
第四种
import pytz
datetime.now().replace(tzinfo=pytz.utc).astimezone(pytz.timezone('Asia/Shanghai'))
datetime.datetime(2019, 11, 4, 8, 26, 28, 393911, tzinfo=<DstTzInfo 'Asia/Shanghai' CST+8:00:00 STD>)