Python内置时间模块:Datetime
1.1 前言
在用Python进行数据处理,尤其是时间序列梳理的处理,经常会涉及处理时间或日期的地方。今天我对Python内置的时间模块来进行整理。
Python内置时间处理模块主要包括:
§ Datetime
§ Time
§ Calendar
概括来说,时间和日期处理的模块和库,有几个主要的概念都是会涉及的,包括:
日期、时间、时间戳、时间和字符串的转换,时区等。
Datetiem、Time、Calendar这三个模块中,用的较多的是Datetime,针对Datetime模块,从构建时间对象实例、时间转换、时间对象的运算三个方面进行梳理。
针对Time模块,从时间获取和时间转换两个方面进行梳理,涉及6个知识点。
首先要介绍的,是我们平时用的比较多的datetime模块,它属于Python内置模块,功能相对较全。
1.2 构建时间对象实例
import datetime
# from datetime import date, datetime, time, timedelta, tzinfo
import time
时间实例的构造包括日期(如2022年3月21日),时间(如20点10分01秒),或者是包含date和time点datetime(如2022年3月21日20点10分01秒),如下是具体构造过程。
1.2.1 日期(date)实例的构造
date是一个理想化的简单型日期,属性有year, month,day。
# 构造日期date实例,指定year,month,day参数的方式
d1 = datetime.date(2022, 0o03, 22) # 0o03是八进制表示方式代表03,否则报错
print(d1)
d2 = datetime.date(2022, 3, 22)) # 也可以直接写3
print(d2)
2022-03-22
2022-03-22
除了上面的构造方式,还可以通过date.today()来构造当天的日期。
Today = datetime.date.today()
print(f'今天日期是:{Today}')
today = Today
今天日期是:2022-03-21
date类型的日期,可以通过.year, .month, .day来获取日期所属的年份,月份和具体的日期号,这几个方法经常在数据分析中用到。
print(f'日期所属的年份为: {today.year}年')
print(f'日期所属的月份为:{today.month}月')
print(f'日期具体的日期号为:{today.day}号')
日期所属的年份为: 2022年
日期所属的月份为:3月
日期具体的日期号为:21号
1.2.2 时间time实例的构造
time是一个独立于任何特定日期的理想化时间,其属性有hour, minute, second,microsecond和tzinfo。
# 构造时间time 实例
import datetime
t1 = datetime.time(12, 32, 0o01) # 用八进制0o前缀
print(t1)
12:32:01
# 获取时间的时 .hour,分.minute,秒.second
print(f'time 所属的小时为:{t1.hour}')
print(f'time 所属的分钟为:{t1.minute}')
print(f'time 所属的秒为:{t1.second}')
time 所属的小时为:12
time 所属的分钟为:32
time 所属的秒为:1
1.2.3 datetime实例的构造
datetime是date和time的结合,其属性有year,month,day,hour,minute,second,microsecond和tzinfo。
import datetime
# 构造时间datetime实例
dt1 = datetime.datetime(2022, 0o3, 22, 12, 43, 2)
print(dt1)
2022-03-22 12:43:02
除了上面的构造方式,在datetime实例化的时候,还有其他的一些方式,包括使用datetime.now()和datetime.today()以及在date的基础上使用combine方法等。
# 使用datetime.now()
dt2 = datetime.datetime.now()
print(dt2)
# datetime.today()
dt3 = datetime.datetime.today()
print(dt3)
# 使用combine方法
d1 = datetime.date.today()
t1 = datetime.time(12, 32, 0o01) #
dt4 = datetime.datetime.combine(d1, t1)
print(dt4)
2022-03-21 19:28:56.951677
2022-03-21 19:28:56.951699
2022-03-21 12:32:01
通过datetime实例化,是我们使用时间经常用到的方法,在日常使用过程中,我们可能只需要具体到某天,或者只需要具体到某天的某个时间点,这时候,也可以通过datetime的一些方法来实现。
# 从datetime来获取日期
day1 = dt4.date()
day2 = datetime.date(2022, 0o03, 22) # 指定日期
print(f'获取的日期为{day1}, {day2}')
# 从datetime来获取具体的时间点
time1 = dt4.time()
print(f'获取的时间点:{time1}\n')
获取的日期为2022-03-21, 2022-03-22
获取的时间点:12:32:01
同样的datetime类型的时间,可以通过.year, .month,.day来获取日期所属的年份,月份和具体的日期号。
year = dt4.year
month= dt4.month
day = dt4.day
print(f'日期所属的年份为:{year}')
print(f'日期所属的月份为:{month}')
print(f'日期所属的日期号为:{day}\n')
日期所属的年份为:2022
日期所属的月份为:3
日期所属的日期号为:21
还有一个可能涉及到的时间是获取某天属于星期几,可以通过weekday()和isoweekday()方法来实现。
# 从datetime来获取日期是星期几
# 使用weekday方法
# 数字从0开始,0代表星期一,1代表星期二,以此类推
dt5 = datetime.date.today()
weekday = dt5.weekday()
print(f'今天日期的\'weekday\'为:{weekday}')
今天日期的'weekday'为:0
# 定义个转换列表
week_list = [0,'星期一', 1,'星期二', 2,'星期三', 3,'星期四', 4,'星期五', 5,'星期六', 6,'星期日']
# 此例用到推导式,得到一个列表
weekday = [week_list[i+1] for i in range(len(week_list)) if week_list[i] == weekday]
print(f'今天是{weekday[0]}')
# 从datetime 来获取日期是星期几
# 使用isoweekday方法
# 数字从1开始,1代表星期一,2代表星期二,以此类推
isoweekday = dt5.isoweekday()
print(f'\n今天日期的\'isoweekday\'为:{isoweekday}')
今天是星期一
今天日期的'isoweekday'为:1
如果datetime的值由于某种原因弄错了,可以通过replace()方法更正。replace方法的参数如下:
datetime.replace(year=self.year, month=self.month, day=self.day, hour=self.hour, minute=self.minute, second=self.second,
microsecond=self.microsecond, tzinfo=self.tzinfo, * fold=0)
# 修改年份
dt6 = dt5.replace(year = 2021)
print(f'年份修改之后:{dt6}')
# 修改年月日
dt7 = dt5.replace(2021, 10, 0o01)
print(f'年月日修改之后:{dt7}')
年份修改之后:2021-03-21
年月日修改之后:2021-10-01
1.2.4 timedelta对象的构造
timedelta对象表示两个date或者time或者datetime的时间间隔。
class datetime.timedelta(day=0, seconds=0, microseconds=0, millseconds=0, minutes=0, hours=0, weeks=0)
所有参数都是可选的并且默认为0。这些参数可以说hi整数或者浮点数,也可以是正数或者负数。
只有days,seconds和microseconds会存储在内部。参数单位的换算规则如下:
1. 1毫秒会转换成1000微妙
2. 1分钟会转换成60秒
3. 1小时会转换成3600秒
4. 1星期会转换成7天
import datetime
delta = datetime.timedelta(weeks=3,
days=10,
hours=6,
minutes=50,
seconds=30,
microseconds=1000,
milliseconds=10000,
)
print(delta)
print(datetime.timedelta(days=31, seconds=24640, microseconds=1000))
print(24640//3600, 24640%3600//60)
31 days, 6:50:40.001000
31 days, 6:50:40.001000
6 50
1.2.5 tzinfo介绍
datetime.tzinfo返回datetime对象的时区,前提是在创建datetime对象是需传入tzinfo参数,如果没有传入则返回值为None。
# 如果没有pytz库,则需要自行安装
# 此案例在Windows环境下可以正常运行
import pytz, datetime
sh = pytz.timezone('Asia/Shanghai')
d_tz = datetime.datetime(2022, 0o03, 22, hour=15, tzinfo=sh)
print(d_tz.tzinfo)
<DstTzInfo 'Asia/Shanghai' LMT+15:06:00 STD>
接下文 Python内置时间模块:Datetime实例详解(二)https://developer.aliyun.com/article/1618144