python 时间减一年 python 日期相减计算月份_元组


在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 格式化时间字符串

timestrftime 方法,可以按照时间格式要求格式化 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 时间字符串转时间元组

timestrptime 方法,解析 (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 种对日期和时间进行处理的类:datetimedatetimetimedelta

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