[英]How to loop the days from frequency until the end of the month for Python?
让我们想象这是我的桌子(在谷歌表格中更好地查看):
index frequency start_execution_date end_month
0 Weekly 2022-11-06 22:15:00 07-02-2023
1 Daily 2022-11-06 22:15:00 07-02-2023
2 Monthly 2022-11-06 22:15:00 07-02-2023
3 ?? 2022-11-06 22:15:00 07-02-2023
4 Once 2022-11-06 21:00:00 07-02-2023
5 Every 1 months 2022-11-06 21:00:00 07-02-2023
6 Every 12 months 2022-11-06 21:00:00 07-02-2023
7 Every 3 months 2022-11-06 21:00:00 07-02-2023
8 SQL Startup 2021-07-29 12:38:01 07-02-2023
9 Every 2 weeks 2022-11-10 12:30:00 07-02-2023
10 Every 6 months 2022-11-10 12:30:00 07-02-2023
我想创建一个“next_schedule”列来反映“频率”列。 开始日期是“start_execution_date”,结束日期是“end_month”列。 问题是我的代码只无限循环 1 次。 所以它预测一次并重复同样的事情。
from calendar import mdays, calendar
from datetime import datetime as dt, timedelta
from datetime import date
from dateutil.relativedelta import relativedelta
from dateutil.rrule import rrule, DAILY
predict = []
for frequency in df1['frequency']:
if frequency == 'Daily':
next= df1['start_execution_date'] + pd.Timedelta(days=1)
predict.append(next)
elif frequency == 'Weekly':
next= df1['start_execution_date'] + pd.Timedelta(weeks=1)
predict.append(next)
elif frequency == 'Every 2 Weeks':
next= df1['start_execution_date'] + pd.Timedelta(weeks=2)
predict.append(next)
elif frequency == 'Monthly':
next= df1['start_execution_date'] + pd.Timedelta(weeks=4)
predict.append(next)
elif frequency == 'Every 1 Months':
next= df1['start_execution_date'] + pd.Timedelta(weeks=4)
predict.append(next)
elif frequency == 'Every 3 Months':
next= df1['start_execution_date'] + pd.Timedelta(weeks=12)
predict.append(next)
elif frequency == 'Every 6 Months':
next= df1['start_execution_date'] + pd.Timedelta(weeks=24)
predict.append(next)
else:
next= df1['start_execution_date']
predict.append(next)
df1.insert(4, "next_schedule", predict, True)
df1
使用上面的示例,它应该循环到下周,但我无法弄清楚。 我在 for 循环之前使用了 while 循环,但遇到了错误。 例如,在示例中,每周频率的 next_schedule 应该是 2022-11-20 22:15:00,而不是 2022-11-13 22:15:00,并且在接下来的几周内一直持续到 end_date。
其次,如何将 next_schedule 分成单独的行而不是全部放在 1 个单元格中?
太感谢了!
我更新了您的代码以适合您寻求的解决方案。
我希望这能解决你的问题
from calendar import mdays, calendar
from datetime import datetime as dt, timedelta
from datetime import date
from dateutil.relativedelta import relativedelta
from dateutil.rrule import rrule, DAILY
from dateutil.parser import parse
df1 = pd.read_csv("Downloads/Frequency Loop - Sheet1.csv")
df1['next_schedule'] = ""
#convert start & end_excution_date format into the same date format
df1["start_execution_date"] = df1["start_execution_date"].apply(lambda x: dt.strptime(x, "%Y-%m-%d %H:%M:%S"))
df1["end_month"] = df1["end_month"].apply(lambda x: dt.strptime(parse(x).strftime('%Y-%m-%d %H:%M:%S'), "%Y-%m-%d %H:%M:%S"))
for frequency in df1['frequency']:
predict = []
start_time = df1.loc[df1.frequency==frequency,'start_execution_date'].values[0]
end_date = df1.loc[df1.frequency==frequency,'end_month'].values[0]
next_date = start_time
if frequency == 'Daily':
while(next_date<end_date):
next_date = next_date + pd.Timedelta(days=1)
predict.append(next_date)
elif frequency == 'Weekly':
while(next_date<=end_date):
next_date = next_date + pd.Timedelta(weeks=1)
predict.append(next_date)
elif frequency == 'Every 2 Weeks':
while(next_date<=end_date):
next_date = next_date + pd.Timedelta(weeks=2)
predict.append(next_date)
elif frequency == 'Monthly':
while(next_date<=end_date):
next_date = next_date + pd.Timedelta(weeks=4)
predict.append(next_date)
elif frequency == 'Every 1 Months':
while(next_date<=end_date):
next_date = next_date + pd.Timedelta(weeks=4)
predict.append(next_date)
elif frequency == 'Every 3 Months':
while(next_date<=end_date):
next_date = next_date + pd.Timedelta(weeks=12)
predict.append(next_date)
elif frequency == 'Every 6 Months':
while(next_date<=end_date):
next_date = next_date + pd.Timedelta(weeks=24)
predict.append(next_date)
else:
predict.append(df1.loc[df1.frequency==frequency,'start_execution_date'].values[0] )
df1.loc[df1.frequency==frequency,'next_schedule'] = " ".join([str(pd.to_datetime(i)) for i in predict])
df1
output:
index frequency start_execution_date end_month \
0 0 Weekly 2022-11-06 22:15:00 2023-07-02
1 1 Daily 2022-11-06 22:15:00 2023-07-02
2 2 Monthly 2022-11-06 22:15:00 2023-07-02
3 3 ?? 2022-11-06 22:15:00 2023-07-02
4 4 Once 2022-11-06 21:00:00 2023-07-02
5 5 Every 1 months 2022-11-06 21:00:00 2023-07-02
6 6 Every 12 months 2022-11-06 21:00:00 2023-07-02
7 7 Every 3 months 2022-11-06 21:00:00 2023-07-02
8 8 SQL Startup 2021-07-29 12:38:01 2023-07-02
9 9 Every 2 weeks 2022-11-10 12:30:00 2023-07-02
10 10 Every 6 months 2022-11-10 12:30:00 2023-07-02
next_schedule
0 2022-11-13 22:15:00 2022-11-20 22:15:00 2022-1...
1 2022-11-07 22:15:00 2022-11-08 22:15:00 2022-1...
2 2022-12-04 22:15:00 2023-01-01 22:15:00 2023-0...
3 2022-11-06 22:15:00
4 2022-11-06 21:00:00
5 2022-11-06 21:00:00
6 2022-11-06 21:00:00
7 2022-11-06 21:00:00
8 2021-07-29 12:38:01
9 2022-11-10 12:30:00
10 2022-11-10 12:30:00
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.