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

目录

    • 关于时间常用到的概念
    • 日期和时间数据的类型工具
    • 字符串和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处理时间基本上是基于时间序列的,会在后续推出相关内容,喜欢点赞收藏评论!

你可能感兴趣的:(Python基础)