isicalendar.week——python中的WEEKNUM(ISO周数获取)

Excel中的weeknum很方便,在python中却“没有”week_num,但可以有datetime.now().isocalendar().week。


(笔记模板由python脚本于2024年10月18日 11:38:15创建,本篇笔记适合喜欢python,爱鼓捣时间对象的coder翻阅)


【学习的细节是欢悦的历程】


  自学并不是什么神秘的东西,一个人一辈子自学的时间总是比在学校学习的时间长,没有老师的时候总是比有老师的时候多。
            —— 华罗庚


等风来,不如追风去……


Excel的weeknum很方便
python中的weeknum
(python却“没有”,但可以自写也可调库)


本文质量分:

97 97 97

本文地址: https://blog.csdn.net/m0_57158496/article/details/143062421

CSDN质量分查询入口:http://www.csdn.net/qc


目 录

  • ◆ python中的weeknum
    • 1、问题描述
    • 2、new一个week_num
    • 3、isocalendar方法更pythonic
      • 3.1 用法示例
      • 3.2 内部样子
    • 4、日历牌
      • 4.1 time
      • 4.2 datetime
    • 5、几个“技点”
      • 5.1 周数获取
      • 5.2 格式化周几为中文字符
    • 6、总结
      • 比较datetime.timetuple和time.localtime


◆ python中的weeknum


1、问题描述


  • 题目描述截屏图片
    在这里插入图片描述
      Excel中的weeknum很方便:在单元格中填入=WEEKNUM(NOW()),就可以得到当前日期是今年第几周的整数。

Excel公式


=WEEKNUM(NOW())



回页目录


2、new一个week_num


  ISO周数计算规则: 开年第一周大于等于四天,才可以计算为当年第一周;否则将设为“上年最后一周”。换句话说就是,“元月一号”只有是周五以前,当年第一周才从元月一号起;不然当年ISO周数将从下周一起数。


week_number


def week_number(wday, yday) -> int:
    ''' iso周数计算 '''
    # 本函数依赖某一天是星期几wday和是当年第x天yday作为参数,返回这一天是当前第几周
    return yday//7 if (yday+wday)%7 > 3 else yday//7+1

  本函数依赖某一天是星期几wday和是当年第x天yday作为参数,返回这一天是当前第几周。


完整脚本

#!/sur/bin/nve python3
from time import localtime 



def week_number(wday, yday) -> int:
    ''' iso周数计算 '''
    # 本函数依赖某一天是星期几wday和是当年第x天yday作为参数,返回这一天是当前第几周
    return yday//7 if (yday+wday)%7 > 3 else yday//7+1


now = localtime() # time.time()为缺省参数,等效localtime(time.time())
print(f"\n\nweek_number功能验证:\n\n函数调用代码:print(week_number({now.tm_wday}, {now.tm_yday}))\n\n输出:{week_number(now.tm_wday, now.tm_yday) = }")

输出:
在这里插入图片描述


  我的week_number的代码逻辑是“偷奸耍滑”的取巧,利用了time.localtime返回的时间元组,这不用考虑和处理闰年和数据错误等等的复杂校验,只需判定当年第一周是从“元月一号”起数还是第二周周一(也就是当年第一个周一,周一不在元月一号的情形)就好。time确保了week_number()所用参数的完全正确



回页目录


3、isocalendar方法更pythonic


  datetime.datetime.now()的isocalendar日历方法更绝,她返回的三个属性分别是year、week、weekday。`weekday’返回值是1-7,对应星期一到星期日。


3.1 用法示例



如:

#!/sur/bin/nve python3
from datetime import datetime 


now = datetime.now()
year, yweek, wday = now.isocalendar()
print(f"\n\n{year}年,第{yweek}周,星期{'空一二三四五六日'[wday]}\n\n")


  • 代码运行效果截屏展示
    在这里插入图片描述
      这里我对datetime.now().calendar().wday返回的1-7int当空一二三四五六日字符串的索引映射,0位用“空”占位,让一二三四五六日与返回的周几int对齐。



回页目录


3.2 内部样子


  年、周数、周几在usocalendar()对象中,就分别是yearweekweekday三个属性。


python代码


my_week = now.isocalendar()
print(f"\n\ndatetime.datetime.now().isocalendar()的样子:\n{my_week}\n\n(my_week是datetime.datetime.now()的别名)\n\n第一个值“年”:{my_week.year = }\n第二个值“周数”:{my_week.week = }\n第三个值“周几”:{my_week.weekday = }\n\n") 


  • 代码运行效果截屏展示
    在这里插入图片描述


回页目录


4、日历牌


  我分别用time和datetime做了日历牌。“日历牌”内容包含日期与时间,当前日期是今天第几天,当前日期是第几周,周几。python的这两个库各有“方便”,下面就简单展示一致代码。


  • “日历牌”效果

    命令行运行指令
    在这里插入图片描述
    程序效果
    在这里插入图片描述
      两种书写方式代码运行效果完全相同

4.1 time


  localtime返回的九位时间元组timetuple,包含了年月日时分秒、周几、当年第几天,但无周数,周数得用到前边new的week_number()


python代码

#!/sur/bin/nve python3
from time import localtime
from time import strftime


def week_number(weekday, days) -> int:
    ''' iso周数计算 '''
    # 本函数依赖某一天是星期几weekday和是当年第x天days作为参数,返回这一天是当前第几周
    return days//7 if (days+weekday)%7 > 3 else days//7+1


def main() -> None:
    ''' 日历牌 '''
    CLEAR = '\033[2J' # 清屏字符串
    now = localtime()
    date_templet = f" {strftime('%Y年%m月%d日', localtime())} "
    time_templet = f" {strftime('(%H:%M:%S)', localtime())} "
    week_templet = f" 第{week_number(now[6], now[7])}周 星期{'一二三四五六日'[now[6]]} "
    print(f"{CLEAR}\n\n{' 日历牌 ':=^39}\n\n\n{date_templet:-^39}\n{time_templet:^42}\n\n\n{f'今天是今年第{now[7]}天':^35}\n\n\n{week_templet:-^37}\n\n\n{'':=^42}\n\n")


if __name__ == '__main__':
    main()
    



回页目录


4.2 datetime


  年、周数、周几在usocalendar()对象中,就分别是yearweekweekday三个属性,可以直接取week周数属性。但这个没有当时日期是当年第几天的直接获取方法。但datetime有timetuple时间元组方法,可兼容time.localtime()。不同的是没有设定缺省参数,可以用`datetime.now()作其参数。


python代码

#!/sur/bin/nve python3
from datetime import datetime


def main() -> None:
    ''' 日历牌 '''
    CLEAR = '\033[2J' # 清屏字符串
    today = datetime.now()
    week = today.isocalendar()
    yday = datetime.timetuple(today).tm_yday
    '''
    timetuple(...) unbound d
atetime.datetime method
    Return time tuple, compatible with tim
e.localtime().'''
    date_templet = f" {today.strftime('%Y年%m月%d日')} "
    time_templet = f" {today.strftime('(%H:%M:%S)')} "
    week_templet = f" 第{week.week}周 星期{'一二三四五六日'[week.weekday-1]} "
    print(f"{CLEAR}\n\n{' 日历牌 ':=^39}\n\n\n{date_templet:-^39}\n{time_templet:^42}\n\n\n{f'今天是今年第{yday}天':^35}\n\n\n{week_templet:-^37}\n\n\n{'':=^42}\n\n")


if __name__ == '__main__':
    main()



回页目录


5、几个“技点”


  前面已经展示了用localtime时间元组算计iso周数,这里不再赘述。这里就讲讲datetime中周数的获取和星期几的中文字符格式化。


5.1 周数获取


  可以定义函数,可以直接读取属性,可以下标索引。


#!/sur/bin/nve python3
from datetime import datetime


def week_num():
    ''' iso周数计算 '''
    year, week, weekday = datetime.now().isocalendar()
    return week


print(week_num()) # 自定义函数
# 属性引用
print(datetime.now().isocalendar().week)
# 正向索引
print(datetime.now().isocalendar()[1]) 
# 逆序索引(负数索引)
print(datetime.now().isocalendar()[-2])



回页目录


5.2 格式化周几为中文字符


修正int


# 加减对齐
index = datetime.now().isocalendar().week - 1
# 模7对对齐
index = datetime.now().isocalendar().week%7
print(f"'一二三四五六日'[index]") # 将输出int对应的星期几中文字符


中文字符串补位


index = datetime.now().isocalendar().week
# 用“空”字填补0位
print(f"'空一二三四五六日'[index]") # 将输出int对应的星期几中文字符



回页目录


6、总结


  任何问题的解决都是想出来的,算法设计也可以有多种实现路径。一般选择最pythonic的一种,优雅、简洁、易于理解、总有多个途径,这是Python的一贯风格。


比较datetime.timetuple和time.localtime


  • 我的观点
    事实上datetime.now().isocalendar().week - 1datetime.now().isocalendar().week%7的效果是完全一致的,只不过是“模7”的不同书写形式而已。😎😎

  • ai回应
    您的理解是正确的。datetime.timetuple() 方法确实与 time.localtime() 方法相似,它们都返回一个表示本地时间的元组。不同之处在于 datetime.timetuple() 需要一个 datetime 对象作为参数,而 time.localtime() 可以直接使用,如果不提供任何参数,则默认使用 time.time() 的结果,即当前时间。

以下是两个方法的基本用法比较:

  • datetime.timetuple() 需要一个 datetime 对象:
import datetime

# 获取当前时间的datetime对象
now = datetime.datetime.now()

# 将datetime对象转换为时间元组
time_tuple = now.timetuple()
  • time.localtime() 可以直接使用,或者提供一个时间戳:
import time

# 获取当前时间的本地时间元组
local_time_tuple = time.localtime()

# 或者,可以提供一个时间戳
timestamp = time.time()
local_time_tuple_from_timestamp = time.localtime(timestamp)

time 模块中,localtime() 方法确实提供了便捷的方式来获取当前时间的本地表示,而 datetime 模块则需要先创建一个 datetime 对象,然后调用 timetuple() 方法。

这种设计上的差异体现了 datetime 模块更加强调面向对象的特点,而 time 模块则提供了更直接的操作方式。两者各有优势,可以根据具体的使用场景和个人偏好来选择。😄



回页首


上一篇:  候机时间计算(数学小题目,练习时间字符串“解析”)(时间字符串的简单处理,可自行解析也可以调库)
下一篇: 



我的HOT博:

  本次共计收集 311 篇博文笔记信息,总阅读量43.82w。数据于2024年03月22日 00:50:22完成采集,用时6分2.71秒。阅读量不小于6.00k的有 7 7 7篇。


推荐条件 阅读量突破6.00k
(更多热博,请点击蓝色文字跳转翻阅)

  • 截屏图片
    在这里插入图片描述
      (此文涉及ChatPT,曾被csdn多次下架,前几日又因新发笔记被误杀而落马。躺“未过审”还不如回收站,回收站还不如永久不见。😪值此年底清扫,果断移除。留此截图,以识“曾经”。2023-12-31)



回页首


老齐漫画头像

精品文章:

来源:老齐教室


Python 入门指南【Python 3.6.3】


好文力荐:


CSDN实用技巧博文:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦幻精灵_cq

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值