使用 dateutil 的相对增量添加 +1(句点)和 -1 天的问题



我使用dateutil的相对增量得到一个类类型错误。我的代码在这里:

#import packages
import numpy as np
import pandas as pd
import datetime as dt
from dateutil.relativedelta import relativedelta
from pandas import DataFrame
from pandas import Series
#timing
pers = 12
monthpp = 1
month_per = int(pers/monthpp)
sdate = dt.date(2016,1,1)
ops = dt.date(2016,3,15)
bop1 = sdate
eop1 = bop1 + relativedelta(months =+ 1, days =- 1)
edate = sdate + relativedelta(months =+ month_per)
rng_bop = pd.date_range(bop1, freq = 'MS', periods = pers)
rng_eop = pd.date_range(eop1, freq = 'M', periods = pers)
ops_line = ops >= rng_bop and ops <= rng_eop
#outputs
print(sdate)
print(edate)
print(rng_bop)
print(rng_eop)

如果有人有更好的替代我的方法,我愿意接受——我正在尝试将excel的东西翻译成python,可能做得不是很有效。

我这部分的最终目标是能够按月、季度、半年或年来调整周期,但现在我很高兴只按月计算。EOP线应为(BOP +周期- 1天)。

我也不认为我的ops_line定义将工作-我试图从逻辑操作符创建一个布尔数组。点吗?

应该是months += 1, days-= 1,而不是months =+ 1, days =- 1,因为后者将月份和天数分别分配给1和-1

Leo Wahyd提到=+/=-在大多数语言中是无效的语法。

阅读文档:

年、月、周、日、时、分、秒、微秒:
相对信息,可能是否定的(argument是复数);添加或者用相对信息减去一个相对增量对原始日期时间值进行相应的算术运算

我认为,实际上,它应该是:

eop1 = bop1 + relativedelta(months = 1, days = -1)
edate = sdate + relativedelta(months = month_per)

我对pandas日期范围也有类似的问题。我尝试使用DateOffset没有成功,然后我发现了这个:

对周期加减整数使周期以其自身的频率移动。不同频率(span)的Period之间不允许进行算术运算。

事实证明,答案其实很简单!假设您的PeriodPeriodRange对象有freq == "M",您可以通过添加常规数字来添加它们:

>>> period
Period('2020-01', 'M')
>>> period + 1
Period('2020-02', 'M')
>>> period_range
PeriodIndex(['2020-01', '2020-02', '2020-03', '2020-04', '2020-05', '2020-06',
             '2020-07', '2020-08', '2020-09', '2020-10', '2020-11', '2020-12'],
            dtype='period[M]', freq='M')
>>> period_range + 1
PeriodIndex(['2020-02', '2020-03', '2020-04', '2020-05', '2020-06', '2020-07',
             '2020-08', '2020-09', '2020-10', '2020-11', '2020-12', '2021-01'],
            dtype='period[M]', freq='M')

我知道这个问题很老了,但希望我的答案对别人有帮助!

相关内容

  • 没有找到相关文章

最新更新