如何在熊猫或python中用特定范围分割日期

时间:2020-02-12 16:43:04

标签: python pandas dataframe

我有以下数据开始日期和结束日期,想编写一个在以下条件下分割日期的函数

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

预先感谢

2 个答案:

答案 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