做量化datetime知道这些就够了

datetime本身是一个模块,其下包含一个datetime类。

from datetime import datetime
temp = datetime.now()
print(temp)
>> 2018-12-17 18:08:56.879317
td = datetime(2018, 12, 18, 13, 24, 16)
print(td)
>> 2018-12-18 13:24:16

问题来了:18:08:56.879317后面的.879317怎么去掉?

很明显是时间的更细定义,但是实际中很多时候用不到,怎么取消呢?

  • 时间戳

时间戳(Timestamp 维基)是指字符串或编码信息用于辨识记录下来的时间日期。国际标准为ISO 8601

计算机中时间用数字表示,人为规定1970年1月1日00:00:00 UTC+00:00时区的时刻称为epoch time,记为0(1970年之前的时间timestamp为负数),当前时间就是相对于epoch time的**秒数**,称为timestamp。

timestamp = 0 = 1970-1-1 00:00:00 UTC+00:00= 1970-1-1 08:00:00 UTC+8:00

全球各地的计算机在任意时刻的timestamp都是完全相同的。

  • datetime类型转换为timestamp
from datetime import datetime
td = datetime(2018, 12, 18, 13, 24, 16)
tt = td.timestamp()
print(tt)
>> 1545110656.0
print(type(tt))
>> <class 'float'>

Python中timestamp是秒数,数据类型是float。如果有小数,小数位表示毫秒数。

java中timestamp使用整数表示毫秒数,此时把timestamp除以1000就得到Python的浮点表示方法。

  • timestamp转换为datetime
from datetime import datetime
t = 21397329
print(datetime.fromtimestamp(t))
>> 1970-09-05 23:42:09
t = 21397329.1
print(datetime.fromtimestamp(t))
>> 1970-09-05 23:42:09.100000
  • 时区问题

timestamp是一个浮点数,它没有时区的概念,而datetime是有时区的。上述转换是在timestamp和本地时间做转换。

本地时间是指当前操作系统设定的时区。

timestamp也可以直接转换成UTC标准时区的时间:

from datetime import datetime
t = 21397329
print(datetime.fromtimestamp(t))
>> 1970-09-05 23:42:09
print(datetime.utcfromtimestamp(t))
>> 1970-09-05 15:42:09
  • datetime与str字符串的相互转换

输入信息经常是字符串格式,要处理时间问题就需要把str转换成datetime。采用datetime.strptime()函数实现:

from datetime import datetime
# 注意%Y-%m-%d区分大小写
cday = datetime.strptime('2018-12-12 19:05:21', '%Y-%m-%d %H:%M:%S')
print(cday)
>> 2018-12-12 19:05:21

datetime转换成str则通过datetime.strftime()函数

from datetime import datetime
now = datetime.now()
print(now.strftime('%a, %b, %d, %H:%M:%S'))
>> Mon, Dec, 17, 19:10:47
  • datetime时间加减

直接±操作,只是需要用到timedelta这个类的辅助。

from datetime import datetime,timedelta
now = datetime.now()
now1 = now + timedelta(days=1, hours=2)
print(now, '\n',now1)
>> 2018-12-17 19:15:17.234980 
>> 2018-12-18 21:15:17.234980
  • timezone关于时区的一个类
from datetime import datetime,timedelta,timezone
tz_utc_8 = timezone(timedelta(hours=8))
print(tz_utc_8)
>> UTC+08:00
now = datetime.now()
print(now)
>> 2018-12-17 19:53:50.374284
n_t = now.replace(tzinfo=tz_utc_8)
print(n_t)
>> 2018-12-17 19:53:50.374284+08:00

datetime类有一个时区属性tzinfo,默认None,所以无法区分这个datetime到底是哪个时区,上述代码强行给其设置一个时区。

  • 当前UTC时间utcnow()
from datetime import datetime,timedelta,timezone
now = datetime.now()
utc_dt = datetime.utcnow()
utc_dt_tz = datetime.utcnow().replace(tzinfo=timezone.utc)
print(now, utc_dt, utc_dt_tz)
>> 2018-12-17 20:02:17.404285
>> 2018-12-17 12:02:17.404285
>> 2018-12-17 12:02:17.404285+00:00
  • astimezone()更改时区
bj_dt = utc_dt.astimezone(timezone(timedelta(hours=8)))
>> 2018-12-17 12:02:17.404285+08:00

更改时区的流程是,先拿到一个datetime,强制设置时区tzinfo,作为基准时间,之后利用astimezone()方法,更改成特定时区。

  • 本地时间与UTC标准时间转换

本地时间是指系统设定时区的时间,例如北京时间是UTC+8:00时区的时间,而UTC时间指UTC+0:00时区的时间。

  • 参考
  1. 还是廖雪峰

.

.

.

2018-12-17 20:22:53写于杭州前往济南的高铁上

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值