Return 使用 python 跨越另一年的 ISO 周列表
Return ISO Week list where it crosses over another year using python
我正在尝试转换一个 yyyyww,它实际上是一个字符串对象,我认为它类似于 201731。我想捕获过去 6 周的时间,包括它自己。
def generate_6_last_week(yearweek):
weeks = [int(yearweek)]
date = time.mktime(datetime.strptime(str(yearweek)+"0","%Y%W%w").timetuple())
for i in range(1,6):
date = date-604800 # 60*60*24*7
weeks.append(int(datetime.fromtimestamp(int(date)).strftime('%Y%W')))
return weeks
generate_6_last_week(201731)
所以 201731 的输出应该是:
[201731, 201730, 201729, 201728, 201727, 201726]
这似乎可行,问题是如果我用像 201702 这样的交叉年份来测试它 returns 这个:
[201702, 201701, 201700, 201651, 201650, 201649]
这看起来也不错,但我在 ISO 周内需要它,所以我认为不应该有 00 周,一年的最后一周应该是 53 或 52 而不是 51。
有什么想法可以调整吗?
我对striptime()
一无所知。所以我通过编写自己的代码解决了这个问题。这是代码:
date=input()
a=int(date[0:4])
b=int(date[4:])
k=5-b
finallist=[]
def m(x,y):
return(x-y)
if b>=5:
date=int(date)
finallist=[date,date-1,date-2,date-3,date-4,date-5]
print(finallist)
else:
date=int(date)
for i in range(b+1):
finallist.append(date)
date-=1
a-=1
b=52
date=int(str(a)+str(b))
for i in range(k):
finallist.append(date)
date-=1
print(finallist)
201700
gives [201700, 201652, 201651, 201650, 201649, 201648]
201702
gives [201702, 201701, 201700, 201652, 201651, 201650]
ALITER:有一种更简单的方法可以做到这一点。只需将 1 添加到列表中的那些特定列表项即可:p
这需要安装 "isoweek" 包,但通过对我的 str YYYYWW 格式进行一些操作,我得到了我想要的东西,并且在跨界年份中运行良好。
from isoweek import Week
yearweek = "201702"
weeks = [int(yearweek)]
x = 1
for i in range(5):
week = int(str(Week(int(yearweek[:4]), int(yearweek[-2:])-x)).replace("W",""))
weeks.append(week)
x +=1
print(weeks)
或函数格式。
def generate_6_last_week(yearweek):
weeks = [int(yearweek)]
x = 1
for i in range(5):
week = int(str(Week(int(yearweek[:4]), int(yearweek[-2:])-x)).replace("W",""))
weeks.append(week)
x +=1
print(weeks)
generate_6_last_week("201702")
我正在尝试转换一个 yyyyww,它实际上是一个字符串对象,我认为它类似于 201731。我想捕获过去 6 周的时间,包括它自己。
def generate_6_last_week(yearweek):
weeks = [int(yearweek)]
date = time.mktime(datetime.strptime(str(yearweek)+"0","%Y%W%w").timetuple())
for i in range(1,6):
date = date-604800 # 60*60*24*7
weeks.append(int(datetime.fromtimestamp(int(date)).strftime('%Y%W')))
return weeks
generate_6_last_week(201731)
所以 201731 的输出应该是:
[201731, 201730, 201729, 201728, 201727, 201726]
这似乎可行,问题是如果我用像 201702 这样的交叉年份来测试它 returns 这个:
[201702, 201701, 201700, 201651, 201650, 201649]
这看起来也不错,但我在 ISO 周内需要它,所以我认为不应该有 00 周,一年的最后一周应该是 53 或 52 而不是 51。
有什么想法可以调整吗?
我对striptime()
一无所知。所以我通过编写自己的代码解决了这个问题。这是代码:
date=input()
a=int(date[0:4])
b=int(date[4:])
k=5-b
finallist=[]
def m(x,y):
return(x-y)
if b>=5:
date=int(date)
finallist=[date,date-1,date-2,date-3,date-4,date-5]
print(finallist)
else:
date=int(date)
for i in range(b+1):
finallist.append(date)
date-=1
a-=1
b=52
date=int(str(a)+str(b))
for i in range(k):
finallist.append(date)
date-=1
print(finallist)
201700
gives[201700, 201652, 201651, 201650, 201649, 201648]
201702
gives[201702, 201701, 201700, 201652, 201651, 201650]
ALITER:有一种更简单的方法可以做到这一点。只需将 1 添加到列表中的那些特定列表项即可:p
这需要安装 "isoweek" 包,但通过对我的 str YYYYWW 格式进行一些操作,我得到了我想要的东西,并且在跨界年份中运行良好。
from isoweek import Week
yearweek = "201702"
weeks = [int(yearweek)]
x = 1
for i in range(5):
week = int(str(Week(int(yearweek[:4]), int(yearweek[-2:])-x)).replace("W",""))
weeks.append(week)
x +=1
print(weeks)
或函数格式。
def generate_6_last_week(yearweek):
weeks = [int(yearweek)]
x = 1
for i in range(5):
week = int(str(Week(int(yearweek[:4]), int(yearweek[-2:])-x)).replace("W",""))
weeks.append(week)
x +=1
print(weeks)
generate_6_last_week("201702")