Python时间序列之datetime模块
在上篇Python时间序列的文章中Peter详细介绍了time模块,本文中重点介绍的是datetime模块。这个模块可以说是time模块的升级版本,使用的情况更为普遍和常见,用法也更为全面。文章中会通过各种例子来讲解模块的使用
目录
本文的目录参考:
Pandas文章
Pandas相关的文章更新到第26篇,近期的重点是:Python或Pandas中如何处理时间序列相关的数据。
上一篇文章是:time模块的讲解,请参考:
datetime模块
主要类
datetime模块中包含的主要类为:
- date:日期对象,常用的属性有year, month, day等
- time:时间对象,主要的属性有hour, minute, second, microsecond
- datetime:日期时间对象,属性date和属性datetime的组合
- datetime_CAPI:日期对象的C语言接口
- timedelta:两个时间之间的时间间隔
- tzinfo:时区信息对象的抽象基类
常量
主要是有两个常量:
- MAXYEAR:返回能表示的最大年份,datetime.MAXYEAR
- MINYEAR:返回能表示最小的年份,datetime.MINYEAR
5大类
下面介绍的datetime模块中5大类的具体使用方法:
- date
- time
- datetime
- timedelta
- tzinfo
在我们使用之前必须先把模块导进来
1 | from datetime import * # *表示模块下面的所有类 |
date类
date对象由year年份、month月份及day日期三个部分来构成的:
当前时间
1 | # 方式1 |
datetime.date(2021, 10, 20)
1 | # 方式2 |
datetime.date(2021, 10, 20)
通过year、month、day 3个属性描述符来访问:
1 | print("今年:",today.year) # 返回today对象的年份 |
今年: 2021
本月: 10
今日: 20
通过__getattribute__(…)方法获得上述值:
1 | today.__getattribute__("year") |
2021
1 | today.__getattribute__("month") |
10
1 | today.__getattribute__("day") |
20
此外,我们还可以访问其他的date类的信息:
1 | print("当前日期:",today) # 当前日期 |
当前日期: 2021-10-20
当前日期(字符串形式): Wed Oct 20 00:00:00 2021
时间(元组形式): time.struct_time(tm_year=2021, tm_mon=10, tm_mday=20, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=2, tm_yday=293, tm_isdst=-1)
1 | print("本星期:",today.weekday()) # 0代表星期一,类推 |
本星期: 2
公历序数: 738083
年/周数/星期: (2021, 42, 3)
自定义时间
指定一个任意的时间:
1 | # 自定义一个时间 |
datetime.date(2021, 12, 8)
1 | # 返回不同的属性 |
year: 2021
month: 12
day: 8
1 | # 返回时间元组 |
time.struct_time(tm_year=2021, tm_mon=12, tm_mday=8, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=2, tm_yday=342, tm_isdst=-1)
1 | # 返回公历序数 |
738132
1 | # 返回星期,0代表星期1,1代表星期2 |
2
1 | # 返回星期,1代表星期1,2代表星期2 |
3
1 | # 返回元组:(年份,第几周,周几) |
(2021, 49, 3)
1 | # 以ISO 8601格式‘YYYY-MM-DD’返回date的字符串形式 |
'2021-12-08'
1 | # 返回日期的字符串 |
'Wed Dec 8 00:00:00 2021'
指定不同的日期输出格式:
1 | # 返回指定格式的日期字符串 |
'2021-12-08'
1 | new_date.strftime("%Y/%m/%d") |
'2021/12/08'
1 | new_date.strftime("%Y年%m月%d日") |
'2021年12月08日'
1 | # 替换时间,比如我们替换new_date |
datetime.date(2021, 11, 10)
在这种情况下,我们就生成了一个新的date对象,当然我们还可以显示的指定参数:
1 | new_date.replace(year=2021,month=11,day=11) |
datetime.date(2021, 11, 11)
公历序数相关
公历序数是和toordinal方法相关的
1 | # 查看当前日期的公历序数 |
738083
将给定的公历序数转成具体的时间日期:fromordinal
1 | print(date.fromordinal(to_timestamp)) |
2021-10-20
时间戳转化
通过函数fromtimestamp进行转化
1 | import time |
1634732660.382036
1 | print(date.fromtimestamp(t)) # 时间戳--->日期 |
2021-10-20
转化任意的时间戳:
1 | date.fromtimestamp(1698382719) |
datetime.date(2023, 10, 27)
时间格式化
1 | # 下面我们对today对象进行格式化输出 |
datetime.date(2021, 10, 20)
1 | print(today.strftime("%Y/%m/%d")) |
2021/10/20
1 | print(today.strftime("%Y-%m-%d")) |
2021-10-20
time类
创建对象
先创建一个任意的时间
1 | from datetime import time |
访问常见属性
时分秒都是常见的属性
1 | print(t.hour) # 时 |
20
30
40
1000
格式化输出
1 | # 返回 ISO 8601格式的时间字符串 |
'20:30:40.001000'
1 | # 指定输出的格式 |
'20:30:40:001000'
同样的,也具有替换功能:
1 | # 隐式替换 |
datetime.time(14, 37, 8, 1000)
1 | # 显式替换 |
datetime.time(4, 18, 19, 1000)
datetime类
datetime对象包含date对象和time对象的所有信息。专属于datetime的方法和属性汇总:
- date(…):返回datetime对象的日期部分
- time(…):返回datetime对象的时间部分
- utctimetuple(…):返回UTC时间元组部分
生成当前日期
1 | from datetime import datetime |
2021-10-20 20:24:23.053493
访问当前时间的不同属性信息:
1 | print("year:",k.year) |
year: 2021
month: 10
day: 20
生成当前时间
1 | # 返回当前的具体时间 |
datetime.datetime(2021, 10, 20, 20, 24, 23, 694127)
1 | # 返回datetime对象的日期部分 |
datetime.date(2021, 10, 20)
1 | # 返回datetime对象的时间部分 |
datetime.time(20, 24, 23, 694127)
1 | # 返回datetime对象的UTC时间元组部分 |
time.struct_time(tm_year=2021, tm_mon=10, tm_mday=20, tm_hour=20, tm_min=24, tm_sec=23, tm_wday=2, tm_yday=293, tm_isdst=0)
还可以生成其他的属性信息:
1 | # 返回当前UTC日期和时间的datetime对象 |
2021-10-20 12:24:24.241577
1 | # 给定时间戳的datetime对象 |
2023-10-15 01:00:30
1 | # 指定公历序数的datetime对象 |
2021-07-29 00:00:00
1 | # 拼接日期和时间 |
2020-12-25 11:22:54
指定任意时间
1 | # 指定一个任意时间 |
1 | print(d.date()) # 日期 |
2021-09-25
11:24:23
11:24:23
time.struct_time(tm_year=2021, tm_mon=9, tm_mday=25, tm_hour=11, tm_min=24, tm_sec=23, tm_wday=5, tm_yday=268, tm_isdst=-1)
738058
5
6
(2021, 38, 6)
2021-09-25T11:24:23
2021-09-25 11:24:23
2021-01-25 11:24:23
格式化输出
1 | # 直接对时间的格式化输出 |
2020-12-25 00:00:00
对给定的datetime对象的格式化输出,比如上面创建的实例化对象k:
1 | k |
datetime.datetime(2021, 10, 20, 20, 24, 23, 53493)
1 | # 格式化输出 |
'2021-10-20 20:24:23'
timedelta类
timedelta对象表示一个时间段,即两个日期 (date) 或日期时间 (datetime) 之间的差值。
目前支持参数:weeks、days、hours、minutes、seconds、milliseconds、microseconds。
当前日期
1 | from datetime import timedelta, date, datetime |
datetime.date(2021, 10, 20)
1 | print("今天:",d) |
今天: 2021-10-20
加上5天: 2021-10-25
加上3天+8小时: 2021-10-23
当前时间点
1 | # 当前时间点 |
datetime.datetime(2021, 10, 20, 20, 24, 26, 777335)
1 | print(now + timedelta(hours=4)) # 加上4个小时 |
2021-10-21 00:24:26.777335
2021-11-03 20:24:26.777335
2021-10-20 20:16:06.777335
datetime对象差值
1 | delta = datetime(2020,12,26) - datetime(2020,12,12,20,12) |
13 days, 3:48:00
1 | delta.days # 日期间隔:天 |
13
1 | delta.seconds # 日期间隔:秒 |
13680
1 | delta.total_seconds() # # 全部转成秒 |
1136880.0
两个日期差值
1 | d1 = datetime(2021,10,1) |
1 | d1.__sub__(d2) # d1 - d2 |
datetime.timedelta(days=-7)
1 | d2.__sub__(d1) # d2 - d1 |
datetime.timedelta(days=7)
1 | # rsub表示用d2 - d1 |
datetime.timedelta(days=7)
上面两个日期的差值结果是datetime.timedelta, 如果获得整数类型的结果则按下面的方法操作:
1 | d1.__sub__(d2).days |
-7
tzinfo类
主要作用是指定时间所在的时区
指定时区
1 | from datetime import date, timedelta, datetime, timezone |
UTC+08:00
1 | now = datetime.now() |
2021-10-20 20:24:28.844732
1 | new_time = now.replace(tzinfo=tz_utc_8) # 强制加上8个小时 |
2021-10-20 20:24:28.844732+08:00
时区切换
1 | # 获取UTC时间 |
2021-10-20 12:24:29.336367+00:00
1 | # 通过astimezone切换到东八区 |
2021-10-20 20:24:29.336367+08:00
1 | # UTC时区切换到东九区:东京时间 |
2021-10-20 21:24:29.336367+09:00
1 | # 北京时间(东八区)直接切换到东京时间(东九区) |
2021-10-20 21:24:29.336367+09:00
常见应用
时间戳转成日期
1 | import time |
1634732670.286224
1 | # 1-转成具体时间点 |
Wed Oct 20 20:24:30 2021
1 | # 2-时间戳先转成时间元组,strftime在转成指定格式 |
time.struct_time(tm_year=2021, tm_mon=10, tm_mday=20, tm_hour=20, tm_min=24, tm_sec=30, tm_wday=2, tm_yday=293, tm_isdst=0)
1 | time.strftime("%Y/%m/%d %H:%M:%S", now_tuple) |
'2021/10/20 20:24:30'
1 | # 选择一个具体的时间戳 |
时间元组数据: time.struct_time(tm_year=2021, tm_mon=4, tm_mday=20, tm_hour=1, tm_min=18, tm_sec=41, tm_wday=1, tm_yday=110, tm_isdst=0)
'2021/04/20 01:18:41'
1 | time.ctime(1618852741) |
'Tue Apr 20 01:19:01 2021'
日期时间转成时间戳
给定一个字符串类型的日期数据,如何转化成我们想要的时间格式呢?
1 | date = "2021-10-26 11:45:34" |
time.struct_time(tm_year=2021, tm_mon=10, tm_mday=26, tm_hour=11, tm_min=45, tm_sec=34, tm_wday=1, tm_yday=299, tm_isdst=-1)
1 | # 2、查看时间数组数据 |
时间数组: time.struct_time(tm_year=2021, tm_mon=10, tm_mday=26, tm_hour=11, tm_min=45, tm_sec=34, tm_wday=1, tm_yday=299, tm_isdst=-1)
1 | # 3、mktime时间数组转成时间戳 |
1635219934.0
日期格式化
1 | import time |
原格式时间: 2021-09-12 12:28:45
新格式时间: 2021/09/12 12-28-45