python时间与时区

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>)
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值