Pendulum模块返回错误周数求助:获取正确月内周数
获取正确的月内周数问题解决方案
哦,这个坑我之前踩过!你得到-48这种奇怪的负数,主要是因为两个点:一是pendulum的week_of_month属性是基于ISO周规则计算的(周一为周起始,且周数会跨月/跨年),二是你的代码里通过date.today()转字符串再解析的方式,可能导致时区不匹配,进而引发了异常的周数计算。
方法一:用Pendulum原生方法获取正确ISO周的月内周数
直接用Pendulum自带的日期方法,避免时区转换的问题:
import pendulum # 获取当前本地时区的日期时间(推荐) dt = pendulum.today() # 或者指定时区,比如东八区 # dt = pendulum.today(tz='Asia/Shanghai') week = dt.week_of_month print(dt) print(week)
这样对于2023-01-19来说,会得到正确的3(因为ISO周中,1月2日是当月第一周的周一,19日属于第三周)。
方法二:自定义“自然周”计算(按每月1号为第一周起始)
如果你想要的不是ISO周规则,而是从每月1号开始,每7天算一周的逻辑(比如1号-7号是第1周,8号-14号是第2周),可以手动计算:
import pendulum dt = pendulum.today() # 计算自然周数 week = (dt.day - 1) // 7 + 1 print(dt) print(week)
这种方式下,2023-01-19会得到3(16号-22号为第3周)。
为什么你的原代码出错?
原代码里pendulum.parse(str(date.today()))会把本地日期转成字符串后,默认按UTC时区解析,这可能导致日期的“实际归属周”发生偏移(比如本地是东八区的话,date.today()的2023-01-19在UTC时区其实是2023-01-18的下午),加上旧版本Pendulum的ISO周计算可能存在的bug,就出现了-48这种异常值。用Pendulum原生的today()方法可以完美规避这个问题。
内容的提问来源于stack exchange,提问作者kalesh cv
相关产品推荐
相关产品推荐

