我在Python中使用Pandas,需要在多个日期范围内划分日期范围 - 并且需要这些范围的开始和结束日期
类似于:
pd.date_range(start='20180301', end='20180311',freq='3D')
应该为每个项目生成一个包含两个值的列表:
[0] 20180301, 20180303
[1] 20180304, 20180306
[2] 20180307, 20180309
[3] 20180310, 20180311
(上一期短于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))