Excel中的weeknum很方便,在python中却“没有”week_num,但可以有datetime.now().isocalendar().week。
(笔记模板由python脚本于2024年10月18日 11:38:15创建,本篇笔记适合喜欢python,爱鼓捣时间对象的coder翻阅)
-
Python 官网:https://www.python.org/
-
Free:大咖免费“圣经”教程《 python 完全自学教程》,不仅仅是基础那么简单……
地址:https://lqpybook.readthedocs.io/
自学并不是什么神秘的东西,一个人一辈子自学的时间总是比在学校学习的时间长,没有老师的时候总是比有老师的时候多。
—— 华罗庚
- My CSDN主页、My HOT博、My Python 学习个人备忘录
- 好文力荐、 老齐教室
本文质量分:
本文地址: 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()对象中,就分别是year
、week
、weekday
三个属性。
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()对象中,就分别是year
、week
、weekday
三个属性,可以直接取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 - 1
与datetime.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篇。
-
001
标题:让QQ群昵称色变的神奇代码
(浏览阅读 5.9w )
地址:https://blog.csdn.net/m0_57158496/article/details/122566500
点赞:25 收藏:86 评论:17
摘要:让QQ昵称色变的神奇代码。
首发:2022-01-18 19:15:08
最后编辑:2022-01-20 07:56:47 -
002
标题:Python列表(list)反序(降序)的7种实现方式
(浏览阅读 1.1w )
地址:https://blog.csdn.net/m0_57158496/article/details/128271700
点赞:8 收藏:35 评论:8
摘要:Python列表(list)反序(降序)的实现方式:原址反序,list.reverse()、list.sort();遍历,全数组遍历、1/2数组遍历;新生成列表,resersed()、sorted()、负步长切片[::-1]。
首发:2022-12-11 23:54:15
最后编辑:2023-03-20 18:13:55 -
003
标题:pandas 数据类型之 DataFrame
(浏览阅读 9.7k )
地址:https://blog.csdn.net/m0_57158496/article/details/124525814
点赞:7 收藏:36
摘要:pandas 数据类型之 DataFrame_panda dataframe。
首发:2022-05-01 13:20:17
最后编辑:2022-05-08 08:46:13 -
004
标题:个人信息提取(字符串)
(浏览阅读 8.2k )
地址:https://blog.csdn.net/m0_57158496/article/details/124244618
点赞:2 收藏:15
摘要:个人信息提取(字符串)_个人信息提取python。
首发:2022-04-18 11:07:12
最后编辑:2022-04-20 13:17:54 -
005
标题:Python字符串居中显示
(浏览阅读 7.6k )
地址:https://blog.csdn.net/m0_57158496/article/details/122163023
评论:1 -
006
标题:罗马数字转换器|罗马数字生成器
(浏览阅读 7.5k )
地址:https://blog.csdn.net/m0_57158496/article/details/122592047
摘要:罗马数字转换器|生成器。
首发:2022-01-19 23:26:42
最后编辑:2022-01-21 18:37:46 -
007
标题:回车符、换行符和回车换行符
(浏览阅读 6.0k )
地址:https://blog.csdn.net/m0_57158496/article/details/123109488
点赞:2 收藏:3
摘要:回车符、换行符和回车换行符_命令行回车符。
首发:2022-02-24 13:10:02
最后编辑:2022-02-25 20:07:40
截屏图片
(此文涉及ChatPT,曾被csdn多次下架,前几日又因新发笔记被误杀而落马。躺“未过审”还不如回收站,回收站还不如永久不见。😪值此年底清扫,果断移除。留此截图,以识“曾经”。2023-12-31)
精品文章:
- 好文力荐:齐伟书稿 《python 完全自学教程》 Free连载(已完稿并集结成书,还有PDF版本百度网盘永久分享,点击跳转免费🆓下载。)
- OPP三大特性:封装中的property
- 通过内置对象理解python'
- 正则表达式
- python中“*”的作用
- Python 完全自学手册
- 海象运算符
- Python中的 `!=`与`is not`不同
- 学习编程的正确方法
来源:老齐教室
◆ Python 入门指南【Python 3.6.3】
好文力荐:
- 全栈领域优质创作者——[寒佬](还是国内某高校学生)博文“非技术文—关于英语和如何正确的提问”,“英语”和“会提问”是编程学习的两大利器。
- 【8大编程语言的适用领域】先别着急选语言学编程,先看它们能干嘛
- 靠谱程序员的好习惯
- 大佬帅地的优质好文“函数功能、结束条件、函数等价式”三大要素让您认清递归
CSDN实用技巧博文: