日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無先后,達(dá)者為師

網(wǎng)站首頁(yè) 編程語言 正文

Python實(shí)現(xiàn)周日歷與時(shí)間相互轉(zhuǎn)換_python

作者:萬百入年許老 ? 更新時(shí)間: 2022-09-06 編程語言

前言

周日歷(ISO國(guó)際標(biāo)準(zhǔn))

介紹在線周日歷(2022年)

基本介紹

在開發(fā)過程中,有些匯總咨詢需要以周為單位統(tǒng)計(jì),所以介紹下如何進(jìn)行相互轉(zhuǎn)換。

使用datetime類格式化進(jìn)行轉(zhuǎn)換

strftime 方法可以將時(shí)間轉(zhuǎn)換為字符串

strptime 方法可以將字符串轉(zhuǎn)為時(shí)間

"%Y,%W,%w"中,"%Y"代表年份,"%W"代表周,"%w"代表一周內(nèi)的第幾天

from datetime import datetime

# 時(shí)間轉(zhuǎn)周日歷
a = datetime.now().strftime("%Y,%W,%w")
print(a)    # 2022,28,3

# 周日歷轉(zhuǎn)時(shí)間
a = datetime.strptime("2022,12,3","%Y,%W,%w")
print(a)    # 2022-03-23 00:00:00

問題

以上貌似問題解決了,但是問題出在年初和年尾

以2021年12月,2022年1月舉例

2021年12月

周數(shù) 周一 周二 周三 周四 周五 周六 周日
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月

周數(shù) 周一 周二 周三 周四 周五 周六 周日
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標(biāo)準(zhǔn),2022年1月1日應(yīng)該歸為2021年的最后一周

使用strftime方法格式化后為2022年第0月,所以這是有問題的

正確方法

使用isocalendar將日期轉(zhuǎn)換為周日歷

datetime類型的時(shí)間直接調(diào)用 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 將周日歷轉(zhuǎn)換為日期

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]:
    """時(shí)間轉(zhuǎn)換為iso周日歷

    Args:
        datetime_ (datetime): 時(shí)間

    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周日歷轉(zhuǎn)換為時(shí)間

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

    Returns:
        datetime: 時(shí)間
    """
    year, week, weekday = isoweek
    return datetime.fromisocalendar(year, week, weekday)

原文鏈接:https://segmentfault.com/a/1190000042107154

欄目分類
最近更新