使用dateutil的relativedelta添加+1(句点)和-1天的问题

时间:2016-10-21 13:48:24

标签: python date relativedelta

我使用dateutil的相对delta获得了一个类类型错误。我的代码在这里:

#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定义会起作用 - 我正在尝试从逻辑运算符创建一个布尔数组。有什么意义吗?

3 个答案:

答案 0 :(得分:1)

它应该是months =+ 1, days =- 1而不是google.com/index.php?v1=x&v=y,因为后者将月和日分配给1和-1分别

答案 1 :(得分:0)

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

阅读documentation

  

年,月,周,日,小时,分钟,秒,微秒:
      相关信息,可能是否定的(参数是复数);加入       或者用相对信息减去相对δ       对原始日期时间值进行相应的aritmetic操作       与relativedelta中的信息。

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

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

答案 2 :(得分:0)

我对熊猫日期范围有类似的问题。我尝试使用 DateOffset 没有成功,然后我发现了 this

<块引用>

从周期中添加和减去整数会按其自身的频率移动周期。不同频率(跨度)的 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')

我知道这个问题已经很老了,但希望我的回答对某人有所帮助!