我有一個假期日期的 df,我正在嘗試在假期前六周列出日期以添加到 df 中。共有三個串列 PreList(前一天)、MiddleList(休息日)和 PostList(后一天)。我正在使用 datetime.timedelta 來獲取假期前的六周,但我不喜歡所有的 if 陳述句。如何減少 if 陳述句?
PreList = []
DuringList = []
PostList = []
for i in range(len(df)):
#for Mon
if df.date[i].weekday() == 0:
preDay = df.date[i] - datetime.timedelta(days = 3)
preWeek = preDay - datetime.timedelta(weeks = 6)
during = df.date[i]
postDay = df.date[i] datetime.timedelta(days = 1)
postWeek = postDay - datetime.timedelta(weeks = 6)
PreList.append(preWeek)
DuringList.append(during)
PostList.append(postWeek)
#for Fri
elif df.date[i].weekday() == 4:
preDay = df.date[i] - datetime.timedelta(days = 1)
preWeek = preDay - datetime.timedelta(weeks = 6)
during = df.date[i]
postDay = df.date[i] datetime.timedelta(days = 3)
postWeek = postDay - datetime.timedelta(weeks = 6)
PreList.append(preWeek)
DuringList.append(during)
PostList.append(postWeek)
#for Sat
elif df.date[i].weekday() == 5:
pre = df.date[i] - datetime.timedelta(days = 1)
preWeek = preDay - datetime.timedelta(weeks = 6)
during = df.date[i]
postDay = df.date[i] datetime.timedelta(days = 2)
postWeek = postDay - datetime.timedelta(weeks = 6)
PreList.append(preWeek)
DuringList.append(during)
PostList.append(postWeek)
#for Sun
elif df.date[i].weekday() == 6:
preDay = df.date[i] - datetime.timedelta(days = 2)
preWeek = preDay - datetime.timedelta(weeks = 6)
during = df.date[i]
postDay = df.date[i] datetime.timedelta(days = 1)
postWeek = postDay datetime.timedelta(weeks = 6)
PreList.append(preWeek)
DuringList.append(during)
PostList.append(postWeek)
#for Tue - Thu
else:
preDay = df.date[i] - datetime.timedelta(days = 1)
preWeek = preDay - datetime.timedelta(weeks = 6)
during = df.date[i]
postDay = df.date[i] datetime.timedelta(days = 1)
postWeek = postDay datetime.timedelta(weeks = 6)
PreList.append(preWeek)
DuringList.append(during)
PostList.append(postWeek)
uj5u.com熱心網友回復:
您可以使用 adict來保存引數。
PreList = []
DuringList = []
PostList = []
params_map = {0: [3, 6, 1, 6],
1: [1, 6, 1, 6],
2: [1, 6, 1, 6],
3: [1, 6, 1, 6],
4: [1, 6, 3, 6],
5: [1, 6, 2, 6],
6: [2, 6, 1, 6]}
for i in range(len(df)):
key = df.date[i].weekday()
params = params_map[key]
preDay = df.date[i] - datetime.timedelta(days=params[0])
preWeek = preDay - datetime.timedelta(weeks=params[1])
during = df.date[i]
postDay = df.date[i] datetime.timedelta(days=params[2])
postWeek = postDay - datetime.timedelta(weeks=params[3])
PreList.append(preWeek)
DuringList.append(during)
PostList.append(postWeek)
uj5u.com熱心網友回復:
我個人會使用一行 if 陳述句,然后用代碼呼叫一個函式。這種方式更簡潔,if 陳述句使用更少的代碼。
weekday5() if df.date[i].weekday() == 5
這些每個占用一行代碼,并呼叫一個函式。這是我知道的最簡單的方法。
uj5u.com熱心網友回復:
我會創建一個時間增量的字典(或更簡單的串列,因為索引從 0-6 開始),這樣您就可以通過簡單的查找生成“前/后”條目:
PreList = []
DuringList = []
PostList = []
pre_post = [
# Pre/post day offsets by weekday.
(3, 1), # Mon
(43, 43), # Tue
(43, 43), # Wed
(43, 43), # Thu
(1, 3), # Fri
(1, 2), # Sat
(44, 43), # Sun
]
for i in range(len(df)):
d = df.date[i]
pre, post = pre_post[d.weekday()]
PreList.append(d - datetime.timedelta(days=pre))
DuringList.append(d)
PostList.append(d datetime.timedelta(days=post))
這不僅減少了if陳述句的數量和整體代碼的數量,而且可以很容易地在一個地方一目了然地查看每天的偏移量(并在需要時更新),而不必滾動瀏覽一堆其他代碼。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/487570.html
上一篇:scala:如果條件從未評估過
