python中周日历与时间的相互转换

python中周日历与时间的相互转换

周日历(ISO国际标准)介绍
在线周日历(2022年)
基本介绍
在开发过程中,有些汇总咨询需要以周为单位统计,所以介绍下如何进行相互转换。
使用datetime类格式化进行转换
  • strftime 方法可以将时间转换为字符串
  • strptime 方法可以将字符串转为时间
  • "%Y,%W,%w"中,"%Y"代表年份,"%W"代表周,"%w"代表一周内的第几天
from datetime import datetime# 时间转周日历 a = datetime.now().strftime("%Y,%W,%w") print(a)# 2022,28,3# 周日历转时间 a = datetime.strptime("2022,12,3","%Y,%W,%w") print(a)# 2022-03-23 00:00:00

问题
  • 以上貌似问题解决了,但是问题出在年初和年尾
  • 以2021年12月,2022年1月举例
2021年12月
周数 周一 周二 周三 周四 周五 周六 周日
48 1 2 3 4 5
49 6 7 8 9 10 11 12
50 13 14 15 16 17 18 19
51 20 21 22 23 24 25 26
52 27 28 29 30 31
2022年1月
周数 周一 周二 周三 周四 周五 周六 周日
52 1 2
1 3 4 5 6 7 8 9
2 10 11 12 13 14 15 16
3 17 18 19 20 21 22 23
4 24 25 26 27 28 29 30
5 31
from datetime import datetimea = datetime.strptime("2021-12-31", "%Y-%m-%d") print(a.strftime("%Y,%W,%w"))# 2021,52,5a = datetime.strptime("2022-01-01", "%Y-%m-%d") print(a.strftime("%Y,%W,%w"))# 2022,00,6

  • 按iso标准,2022年1月1日应该归为2021年的最后一周
  • 使用strftime方法格式化后为2022年第0月,所以这是有问题的
正确方法
使用isocalendar将日期转换为周日历 【python中周日历与时间的相互转换】datetime类型的时间直接调用 isocalendar 方法
from datetime import datetimedef str_to_time(time_str: str) -> datetime: return datetime.strptime(time_str, "%Y-%m-%d")time_list = [ "2021-12-30", "2021-12-31", "2022-01-01", "2022-01-02", "2022-01-03", ]for i in time_list: t = str_to_time(i) iso = t.isocalendar() print(i, " > ", f"{iso.year},{iso.week},{iso.weekday}")# 2021-12-30>2021,52,4 # 2021-12-31>2021,52,5 # 2022-01-01>2021,52,6 # 2022-01-02>2021,52,7 # 2022-01-03>2022,1,1

使用 fromisocalendar 将周日历转换为日期
from datetime import datetimetime_list = ( (2021, 52, 4), (2021, 52, 5), (2021, 52, 6), (2021, 52, 7), (2022, 1, 1), ) for year, week, weekday in time_list: t = datetime.fromisocalendar(year, week, weekday) print(f"{year},{week},{weekday}", " > ", t)# 2021,52,4>2021-12-30 00:00:00 # 2021,52,5>2021-12-31 00:00:00 # 2021,52,6>2022-01-01 00:00:00 # 2021,52,7>2022-01-02 00:00:00 # 2022,1,1>2022-01-03 00:00:00

python代码
from datetime import datetimedef datetime_to_isoweek(datetime_: datetime) -> tuple[int, int, int]: """时间转换为iso周日历Args: datetime_ (datetime): 时间Returns: tuple[int,int,int]: year,week,weekday """ iso = datetime_.isocalendar() return iso.year, iso.week, iso.weekdaydef isoweek_to_datetime(isoweek: tuple[int, int, int]) -> datetime: """iso周日历转换为时间Args: isoweek (tuple[int,int,int]): year,week,weekdayReturns: datetime: 时间 """ year, week, weekday = isoweek return datetime.fromisocalendar(year, week, weekday)

    推荐阅读