我有以下数据开始日期和结束日期,想编写一个在以下条件下分割日期的函数
1:以3个月为间隔进行拆分。如果上次拆分少于2个月..将日期范围添加到上一个拆分中(例如:第4个拆分应为2018-08-01至2018-09-23,少于2个月,因此它已添加到上一行)
function should be like
def (start_date=none ,end_date= none)
ex: if Start_date= 17-01-01 end_date -2018-09-23
Start_date end_date
2017-01-01 2017-03-31
2017-04-01 2017-06-31
2018-06-01 2018-09-23
预先感谢
答案 0 :(得分:0)
我将使用 dateutil 库来查找日期之间的两个月差异,并使用 datetime 库来定义日期对象。
import datetime
from dateutil.relativedelta import relativedelta
假设输入是日期时间对象
start_date = datetime.date(2017,1,1)
end_date = datetime.date(2018,8,23)
我创建了一个列表来跟踪所有间隔的开始日期。
ls = []
我将start_date追加到列表中,并使用while循环将start_date变量增加3个月。
使用 relativedelta 函数,发现end_date少于2个月加上下一个start_date时,中断循环。
您可以看到如果条件是在开始日期更新之后写入的。
while True:
ls.append(start_date)
start_date = start_date + relativedelta(months=3)
if end_date < start_date + relativedelta(months=2):
break
if start_date > end_date:
break
现在,除了最后一个元素外,打印当前开始日期,比下一个开始日期少1天。 对于最后一个元素,请打印开始日期和结束日期。
print('start_date','end_date')
for i in range(len(ls)-1):
print(ls[i],ls[i+1]-datetime.timedelta(days=1))
print(ls[-1],end_date)
输出:
start_date end_date
2017-01-01 2017-03-31
2017-04-01 2017-06-30
2017-07-01 2017-09-30
2017-10-01 2017-12-31
2018-01-01 2018-03-31
2018-04-01 2018-08-23
答案 1 :(得分:0)
dates = pd.Series(pd.date_range(start='20180301', end='20180311'))
df = pd.DataFrame(df, columns=['dates'])
df = df['dates'].groupby(np.arange(len(df['dates']))//3).agg(['first', 'last'])
df
输出:
first last
0 2018-03-01 2018-03-03
1 2018-03-04 2018-03-06
2 2018-03-07 2018-03-09
3 2018-03-10 2018-03-11