python - 如何在熊猫或python中分割具有特定范围的日期
问题描述
我有以下数据开始日期和结束日期,想编写一个函数,在以下条件下拆分日期
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
提前致谢
解决方案
我将使用dateutil库来查找日期和datetime库之间的 2 个月差异来定义日期对象。
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 时打破循环。
您可以看到if条件是在 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
现在除了最后一个元素,打印当前的 start_date 和比下一个 start_date 少 1 天。对于最后一个元素,打印 start_date 和 end_date。
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
推荐阅读
- reactjs - TypeError:无法读取反应中未定义的属性“地图”/
- android - 使用 Volley 发送带有承载令牌身份验证的 Post 请求
- reactjs - 使用 react-leaflet-editable 和 react-leaflet 2.8.0
- android - 在自定义 BroadcastReceiver 中接收地理围栏事件
- c# - 将 DataGridView 的行高度设置为自定义值很慢
- javascript - Html 从给定数组中选择选项未显示
- python - python2.7线程池比逐个启动线程快很多
- react-native - React Native - 广告请求成功,但由于广告库存不足,没有返回广告
- javascript - 停止触发事件
- c++ - 抛出 C++20 协程上的 AddressSanitizer 错误