繁体   English   中英

对于 Python,如何循环从频率到月末的天数?

[英]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 个单元格中?

太感谢了!

我更新了您的代码以适合您寻求的解决方案。

  • 您插入下一个计划列的方式是添加行而不是列
  • 您需要将列转换为可以添加到 timedelta output 的格式

我希望这能解决你的问题

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM