Python中处理datetime时间格式数据的基本思路

关于时间常用到的概念

  • 时间戳,具体的时刻
  • 固定的时间区间,例如2017年一月或者2017年全年
  • 时间间隔,由开始和结束的时间戳决定,区间是一个特殊的时间间隔
  • 实验时间或消耗时间,例如自烤箱工作每秒饼干的直径变化。

日期和时间数据的类型工具

python标准库中的datetime.datetime,time和calendar是处理时间和日期格式的常见模块,介绍其中的datetime:

from datetime import datetime
now = datetime.now()
now
datetime.datetime(2020, 2, 8, 16, 54, 18, 987524)
now.year, now.month, now.day
(2020, 2, 8)

datetime存储了精细化的时间数据,年月日时分秒和微秒的数据。

timedelta表示两个时间的时间差:

delta = datetime(2011, 1, 7) - datetime(2008, 6, 24, 8, 15)
delta
datetime.timedelta(days=926, seconds=56700)
delta.days, delta.seconds
(926, 56700)

同样我们可以使用时间戳和一个时间差计算新的时间:

from datetime import timedelta
start = datetime(2017, 1, 7)
start + timedelta(12) # 加上12天的时间差
datetime.datetime(2017, 1, 19, 0, 0)
start - 2 * timedelta(12)  # 如果是我可能会考虑12 * 2
datetime.datetime(2016, 12, 14, 0, 0)
  • datetime中的模块
类型描述
date使用公历日历存储日历日期(年,月,日)
time将时间存储为小时、分钟、秒和微秒
datetime存储日期和时间
timedelta表示两个datetime之间的差(如日、秒和微秒)
tzinfo用于存储时区信息的基本类型

字符串和datetime相互转化

这是一个开放的命题:

  • 利用正则提取年月日时分秒信息,生成datetime
  • 利用字符串的格式化输出转化时间
  • 利用datetime的strftime将datetime格式转化为字符串
  • 利用datetime的strptime将字符串解析成datetime
  • pandas提供了相对的处理办法

这里主要介绍datetime的处理方式:

时间转字符串

stamp = datetime(2011, 1, 3)
str(stamp)
'2011-01-03 00:00:00'
stamp.strftime('%Y/%m/%d')
'2011/01/03'
  • datetime格式说明
类型描述
%Y四位的年份
%y两位的年份
%m两位的月份[01, 12]
%d两位的日期[01, 31]
%H小时,24小时制[00, 23]
%I小时,12小时制[01, 12]
%M两位的分钟[00, 59]
%S秒[00, 61](60、61是闰秒)
%w星期日期[0(星期天), 6]
%U一年中的星期数[00, 53]。以星期天为每一周的第一天,一年中第一个星期天前的日期作为“第0周”
%W一年中的星期数[00, 53]。以星期一为每一周的第一天,一年中第一个星期一前的日期作为“第0周”
%z格式为+HHMM或-HHMM的UTC时区偏移;如果没有时区则为空
%F%Y-%m-%d的简写(2012-04-18)
%D%m/%d/%y的简写(04/18/12)

字符串转化为时间

value = '2011-01-03'
datetime.strptime(value, '%Y-%m-%d')
datetime.datetime(2011, 1, 3, 0, 0)
datestrs = ['7/6/2011', '8/6/2011']
[datetime.strptime(date, '%m/%d/%Y') for date in datestrs]
[datetime.datetime(2011, 7, 6, 0, 0), datetime.datetime(2011, 8, 6, 0, 0)]

让转化稍微智能点

datetime.strptime在已知格式下处理比较好,每次都要手动编写格式代码有点繁琐。对于通用日期格式我们可以使用第三方的dateutil包里的parser.parse方法(pandas安装时会自行安装这个包):

from dateutil.parser import parse
parse('2011-01-09')
datetime.datetime(2011, 1, 9, 0, 0)

dateutil能解析大部分人类理解的日期表达:

parse('Jan 31, 1997 10:45 PM')
datetime.datetime(1997, 1, 31, 22, 45)

不常出现的日期在月份前面可以指定参数实现:

parse('6/12/2011', dayfirst=True)
datetime.datetime(2011, 12, 6, 0, 0)
parse('6/12/42') # 如果你要的是1942年就要小心了
datetime.datetime(2042, 6, 12, 0, 0)

pandas处理时间基本上是基于时间序列的,会在后续推出相关内容,喜欢点赞收藏评论!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值