我尝试使用python的calendar.itermonthdates()为数据仓库生成时间维度。
我对自己的小可爱脚本感到满意,直到发现该迭代器的工作原理多么古怪。主要是说2018-12-31
和2019-01-06
之间的一周是2018年12月的第1周
以下是我的参考代码:
for year in range(2018, 2022):
for month in range(1, 13):
startdate = 0
enddate = 0
week_num = 0
for date in cal.itermonthdates(year, month):
if date.isoweekday() == 1:
startdate = date
week_num = date.isocalendar()[1]
ts = Timestamp(date)
if date.isoweekday() == 7:
enddate = date
if date.isoweekday() != 7:
enddate = date
#some more code
此外,我希望在2018-12-31
和2019-01-06
期间获得2018年12月40日左右和2019年1月1日第一周。
但是我实际上得到了两条记录:
|----------|----------|------|---------|--------|
|start_date|end_date |wk_num|month_num|year_num|
|----------|----------|------|---------|--------|
|2018-12-31|2019-01-06|1 |12 |2018 |
|2018-12-31|2019-01-06|1 |1 |2019 |
我想问题出在datetime
模块的isocalendar()(返回[yr_num, wk_num, wk_day]
)中,因为:
for date in cal.itermonthdates(2018, 12):
print(date, date.isocalendar(), date.isoweekday())
[...]
2018-12-31 (2019, 1, 1) 1
[...]
我自然可以稍后再更新那些记录,但是那是我无法正确编写脚本的痛苦。有提示吗?