在Pandas

时间:2018-03-25 15:35:51

标签: python pandas

我在Python中使用Pandas,需要在多个日期范围内划分日期范围 - 并且需要这些范围的开始和结束日期

类似于:

pd.date_range(start='20180301', end='20180311',freq='3D')

应该为每个项目生成一个包含两个值的列表:

[0] 20180301, 20180303
[1] 20180304, 20180306
[2] 20180307, 20180309
[3] 20180310, 20180311

(上一期短于3天,但以整体结束日期结束)

3 个答案:

答案 0 :(得分:2)

IIUC:

In [217]: dates = pd.Series(pd.date_range(start='20180301', end='20180311'))

In [218]: dates
Out[218]:
0    2018-03-01
1    2018-03-02
2    2018-03-03
3    2018-03-04
4    2018-03-05
5    2018-03-06
6    2018-03-07
7    2018-03-08
8    2018-03-09
9    2018-03-10
10   2018-03-11
dtype: datetime64[ns]

In [219]: df = dates.groupby(np.arange(len(dates))//3).agg(['first', 'last'])

In [220]: df
Out[220]:
       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

答案 1 :(得分:2)

我不确定您希望列表的格式是什么,但是当您在pandas工作时,这里有一个选项:

dates = pd.date_range(start='20180301', end='20180311',freq='3D')

df = pd.DataFrame([[i, x] for i, x in 
                   zip(dates, dates.shift(1)-pd.offsets.Day(1)], 
                   columns=['start','end'])

df['end'].iloc[-1] = dates[-1]+pd.offsets.Day(1)

>>> df
       start        end
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

唯一不幸的是,你必须明确地将最后end日期设置为原始日期范围的结尾(就像我对df['end'].iloc[-1]所做的那样),但我真的看不到任何方式。

答案 2 :(得分:0)

无需使用熊猫也可以实现相同的目的。

import datetime

firstDate = datetime.datetime.strptime("2019-01-01", "%Y-%m-%d")
lastDate = datetime.datetime.strptime("2019-03-30", "%Y-%m-%d")
numberOfDays = 15
startdate = firstDate
startdatelist = []
enddatelist = []

while startdate <= lastDate:
    enddate = startdate + datetime.timedelta(days=numberOfDays - 1)
    startdatelist.append(startdate.strftime("%Y-%m-%d 00:00:00"))
    if enddate > lastDate: enddatelist.append(lastDate.strftime("%Y-%m-%d 23:59:59"))
    enddatelist.append(enddate.strftime("%Y-%m-%d 23:59:59"))
    startdate = enddate + datetime.timedelta(days=1)

for a, b in zip(startdatelist, enddatelist):
    print(str(a) + "  -  " + str(b))