pandas自定义频率场景下date_range不包含区间末尾日期如何解决
问题原因
pd.date_range生成固定步长的日期序列时,若最后一次按步长累加的结果超过指定的结束日期,会自动丢弃该节点,仅返回所有小于等于结束日期的步长节点。closed/inclusive参数仅用于控制符合步长规则的首尾节点是否保留,无法解决步长跳过结束日期的场景。
解决方案
无需额外编写周期计算逻辑,仅需在生成序列后追加判断补入结束日期即可,修改后代码如下:
import pandas as pd import datetime as dt from datetime import date, timedelta def getDates(sD, eD, f): # 解析起止日期 sD = dt.datetime.strptime(sD, '%m/%d/%Y') eD = dt.datetime.strptime(eD, '%m/%d/%Y') sd_t = date(sD.year,sD.month,sD.day) ed_t = date(eD.year,eD.month,eD.day) # 频率映射 freqDict = {'1h':'40D', '4h':'162D', '1d':'1000D'} dateVector = pd.date_range(sd_t, ed_t, freq = freqDict[f]) # 补全结束日期 if dateVector[-1] != ed_t: dateVector = dateVector.append(pd.DatetimeIndex([ed_t])) return dateVector
效果验证
调用getDates('01/01/2020', '01/01/2021', '4h')得到的结果将包含结束日期:
0 2020-01-01 1 2020-06-11 2 2020-11-20 3 2021-01-01
该改法不会破坏原有适配API请求上限的步长规则,最后一段不足步长的区间数据量也不会超过1000条的限制。
内容的提问来源于stack exchange,提问作者Aquiles Páez
相关产品推荐
相关产品推荐

