在Python中,与时间和日期处理相关模块有:time
模块、datetime
模块和 calendar
模块。
1 time模块
time 模块提供时间相关的类和函数。
1.1 获取当前时间
import time
seconds = time.time()
local_time = time.localtime(seconds) # 时间浮点数转换为时间元组
print(seconds)
print(local_time)
# 输出
1598181396.107466
time.struct_time(tm_year=2020, tm_mon=8, tm_mday=23, tm_hour=19, tm_min=16, tm_sec=36, tm_wday=6, tm_yday=236, tm_isdst=0)
1.2 格式化时间字符串
time
类 strftime
方法,可以按照时间格式要求格式化 struct_time
为时间字符串。
常用的时间格式:
%Y
:四位数的年份表示(0000-9999)
%m
:月份(01-12)
%d
:月内中的一天(0-31)
%H
:24小时制小时数(0-23)
%M
:分钟数(00-59)
%S
:秒(00-59)
import time
local_time = time.localtime()
format_time = time.strftime('%Y-%m-%d %H:%M:%S', local_time)
print(format_time)
# 输出
2020-08-23 19:41:08
1.3 时间字符串转时间元组
time
类 strptime
方法,解析 (parse
) 时间字符串为 struct_time
类型的时间。
import time
format_time = '2020-08-23 19:41:08'
str_to_struct = time.strptime(format_time, '%Y-%m-%d %H:%M:%S')
print(str_to_struct)
# 输出
time.struct_time(tm_year=2020, tm_mon=8, tm_mday=23, tm_hour=19, tm_min=41, tm_sec=8, tm_wday=6, tm_yday=236, tm_isdst=-1)
注意,使用strptime
时,第二个参数的时间格式,要匹配上第一个参数的时间格式。
2 datetime模块
datetime模块提供了 4 种对日期和时间进行处理的类:date、time、datetime 和 timedelta。
2.1 date
date
类可以表示包含年、月、日等信息的日期值。
from datetime import date
## 当前日期
now_date = date.today()
str_date = date.strftime(now_date,'%Y-%m-%d')
print(type(now_date), now_date)
print(type(str_date), str_date)
print(f'year={now_date.year}, month={now_date.month}, day={now_date.day}')
# 输出
<class 'datetime.date'> 2020-08-23
<class 'str'> 2020-08-23
year=2020, month=8, day=23
## 指定日期
date1 = date(2020, 8 ,23)
str_date = date.strftime(date1,'%Y-%m-%d')
print(str_date)
# 输出
2020-08-23
2.2 time
time
类可以表示包含时、分、秒、微秒、时区等信息的时间对象。
from datetime import time
tm = time(12, 0, 0)
print(type(tm), tm)
# 输出
<class 'datetime.time'> 12:00:00
2.3 datetime
datetime
类可以表示完整的日期和时间,类似 time
类和 date
类的结合。
from datetime import datetime
dt = datetime.now() # 获取当前的日期时间
str_dt = datetime.strftime(dt,'%Y-%m-%d %H:%M:%S')
print(dt)
print(str_dt)
print(dt.date()) # 返回日期部分
print(dt.time()) # 返回时间部分
print(dt.year) # 年
print(dt.isoweekday()) # 星期几
# 输出
2020-08-23 20:48:59.848876
2020-08-23 20:48:59
2020-08-23
20:48:59.848876
2020
7
在处理含有字符串日期的数据集时,我们需要一种自动解析字符串的方法,无论它是什么格式的,都可以将其转化为 datetime 对象。 可以使用dateutil 中的 parser 模块来实现这个需求。
from dateutil import parser
str_date = '2020-06-25'
dt = parser.parse(str_date)
print(type(dt), dt)
# 输出
<class 'datetime.datetime'> 2020-06-25 00:00:00
2.4 timedelta
timedelta
类表示某个特定长度的时间段,即两个日期或时间之间的间隔。两个 datetime
相减会得到 timedelta
对象,也可以用 datetime
加上或者减去 timedelta
得到新的时间值。
from datetime import datetime, timedelta
dt1 = datetime(2020, 8, 1)
dt2 = dt1 + timedelta(hours=12, minutes=30)
dt3 = dt1 + timedelta(days=10)
dt4 = dt1 + timedelta(weeks=2)
print(dt2)
print(dt3)
print(dt4)
# 输出
2020-08-01 12:30:00
2020-08-11 00:00:00
2020-08-15 00:00:00
3 calendar模块
3.1 绘制年日历图
import calendar
from datetime import date
now_date = date.today()
year_calendar_str = calendar.calendar(2020)
print(f"{now_date.year}年的日历图:{year_calendar_str}n")
# 输出
2020年的日历图: 2020
January February March
Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su
1 2 3 4 5 1 2 1
6 7 8 9 10 11 12 3 4 5 6 7 8 9 2 3 4 5 6 7 8
13 14 15 16 17 18 19 10 11 12 13 14 15 16 9 10 11 12 13 14 15
20 21 22 23 24 25 26 17 18 19 20 21 22 23 16 17 18 19 20 21 22
27 28 29 30 31 24 25 26 27 28 29 23 24 25 26 27 28 29
30 31
April May June
Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su
1 2 3 4 5 1 2 3 1 2 3 4 5 6 7
6 7 8 9 10 11 12 4 5 6 7 8 9 10 8 9 10 11 12 13 14
13 14 15 16 17 18 19 11 12 13 14 15 16 17 15 16 17 18 19 20 21
20 21 22 23 24 25 26 18 19 20 21 22 23 24 22 23 24 25 26 27 28
27 28 29 30 25 26 27 28 29 30 31 29 30
July August September
Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su
1 2 3 4 5 1 2 1 2 3 4 5 6
6 7 8 9 10 11 12 3 4 5 6 7 8 9 7 8 9 10 11 12 13
13 14 15 16 17 18 19 10 11 12 13 14 15 16 14 15 16 17 18 19 20
20 21 22 23 24 25 26 17 18 19 20 21 22 23 21 22 23 24 25 26 27
27 28 29 30 31 24 25 26 27 28 29 30 28 29 30
31
October November December
Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su
1 2 3 4 1 1 2 3 4 5 6
5 6 7 8 9 10 11 2 3 4 5 6 7 8 7 8 9 10 11 12 13
12 13 14 15 16 17 18 9 10 11 12 13 14 15 14 15 16 17 18 19 20
19 20 21 22 23 24 25 16 17 18 19 20 21 22 21 22 23 24 25 26 27
26 27 28 29 30 31 23 24 25 26 27 28 29 28 29 30 31
30
3.2 绘制月日历图
import calendar
from datetime import date
now_date = date.today()
month_calendar_str = calendar.month(now_date.year, now_date.month)
print(f"{month_calendar_str}")
# 输出
August 2020
Mo Tu We Th Fr Sa Su
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
3.3 判断是否为闰年
import calendar
from datetime import date
now_date = date.today()
is_leap = calendar.isleap(now_date.year)
if is_leap:
print("%s年是闰年"%now_date.year)
else:
print("%s年不是闰年"%now_date.year)
# 输出
2020年是闰年
3.4 判断月有几天
import calendar
from datetime import date
now_date = date.today()
weekday, days = calendar.monthrange(now_date.year, now_date.month)
print(f'{now_date.year}年-{now_date.month}月的第一天是那一周的第{weekday}天')
print(f'{now_date.year}年-{now_date.month}月共有{days}天')
# 输出
2020年-8月的第一天是那一周的第5天
2020年-8月共有31天
3.5 月的第一天和最后一天
from datetime import date
import calendar
# 月的第一天
now_date = date.today()
month_first_day = date(now_date.year, now_date.month, 1)
print(f"当月第一天:{month_first_day}")
# 月的最后一天
_, days = calendar.monthrange(now_date.year, now_date.month)
month_last_day = date(now_date.year, now_date.month, days)
print(f"当月最后一天:{month_last_day}")
# 输出
当月第一天:2020-08-01
当月最后一天:2020-08-31