我想根据开始日分配0-6。例如,如果星期三是开始日,我应该将星期三定为0,然后星期四定为1,星期五定为2等......
这是我试过的
def date_manipulate(startday):
#df['Month']=df.index.strftime("%B")
temp_week=['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday']
week={}
currentday=0
offset=temp_week.index(startday)
for day in temp_week:
if temp_week:
pointer=temp_week.index(day)+offset%len(temp_week)
if (pointer>=8):
pointer-=7
week[temp_week[pointer]]=currentday
currentday+=1
else:
break
return week
这不会返回正确的数字(即:星期三是7),由于某种原因,它会迭代9次而不是7次。我也尝试从位置3 [3:]开始切片索引,这将跳过前2,这也不是我想要的。最后,我只是试图将一周的开始日改为我定义的而不是周日修复功能。一旦我得到函数工作,我将做一些if语句循环默认的一周,并用这个新的字典替换它。谢谢!
答案 0 :(得分:2)
default_week =['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']
def date_manipulate(startday):
week = {}
temp_week = default_week[startday:] + default_week[0:startday]
for index, day in enumerate(temp_week):
week[index] = day
return week
周二的输出作为开始日期(date_manipulate(2)
)
{0:'星期二',1:'星期三',2:'星期四',3:'星期五',4: '星期六',5:'星期天',6:'星期一'}
修改强>
如果您打算在字典中获取Tuesday: 0
而不是0: Tuesday
,请使用
week[day] = index
答案 1 :(得分:1)
您可以使用enumerate
这样简化您的功能:
def date_manipulate(day):
temp_week=['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday']
i = temp_week.index(day)
return dict(enumerate(temp_week[i:] + temp_week[:i]))
>>> date_manipulate('Wednesday')
>>> {0: 'Wednesday', 1: 'Thursday', 2: 'Friday', 3: 'Saturday', 4: 'Sunday', 5: 'Monday', 6: 'Tuesday'}
>>> date_manipulate('Tuesday')
>>> {0: 'Tuesday', 1: 'Wednesday', 2: 'Thursday', 3: 'Friday', 4: 'Saturday', 5: 'Sunday', 6: 'Monday'}
答案 2 :(得分:1)
您可以将列表拆分为两部分并将它们连接起来。
n = week.index(day)
new_week = week[n:] + week[:n]
在第二个子列表中,它会上升,但不包括n
答案 3 :(得分:0)
您有for day in temp_week:
,但唯一的目的是让day
成为temp_week.index(day)
整数。您不能将day
用于其他任何事情。
为什么这么复杂?更简单的是for i in range(7):
,
然后只使用i
代替temp_week.index(day)
。
接下来,temp_week.index(day)+offset%len(temp_week)
将采用offset
模len(temp_week)
,其评估为offset
,因为offset
始终至少为0且小于len(temp_week)
;
然后将offset
添加到temp_week.index(day)
,当然有时会提供大于6的结果。
注意运算符的优先级,并在需要时使用括号:
pointer = (temp_week.index(day) + offset) % len(temp_week)
当然,更好的方式是正确使用切片,如Evyatar的回答。
答案 4 :(得分:0)
使用cycle
和dropwhile
非常容易使用itertools。逻辑cycle
将创建一个无限长的周列表,dropwhile
将用于获取“周期”中的第一天:
from itertools import cycle, dropwhile
target_day = 'Wednesday'
week_cycle = cycle(['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'])
day_number = range(7)
print(list(zip(dropwhile(lambda x: x != target_day, week_cycle), day_number)))
输出
[('Wednesday', 0), ('Thursday', 1), ('Friday', 2), ('Saturday', 3), ('Sunday', 4), ('Monday', 5), ('Tuesday', 6)]
或在函数中
def day_week(day='Wednesday'):
return list(zip(dropwhile(lambda x: x != target_day, week_cycle), range(7)))