乐趣区

关于python: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 datetime

a = datetime.strptime("2021-12-31", "%Y-%m-%d")
print(a.strftime("%Y,%W,%w"))   # 2021,52,5

a = 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 将日期转换为周日历

datetime 类型的工夫间接调用 isocalendar 办法

from datetime import datetime


def 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 datetime

time_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 datetime


def 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.weekday


def isoweek_to_datetime(isoweek: tuple[int, int, int]) -> datetime:
    """iso 周日历转换为工夫

    Args:
        isoweek (tuple[int,int,int]): year,week,weekday

    Returns:
        datetime: 工夫
    """
    year, week, weekday = isoweek
    return datetime.fromisocalendar(year, week, weekday)
退出移动版