0

我使用 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 + Period - 1 天)。

我也不认为我的 ops_line 定义会起作用 - 我正在尝试从逻辑运算符创建一个布尔数组。有什么积分吗?

4

3 回答 3

1

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

于 2016-10-21T13:51:43.303 回答
0

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

阅读文档

年、月、周、日、小时、分钟、秒、微秒:
相对信息,可能为负数(参数为复数);使用相对信息添加或减去 relativedelta 会对使用 relativedelta 中的信息的原始日期时间值执行相应的算术运算。

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

eop1 = bop1 + relativedelta(months = 1, days = -1)
edate = sdate + relativedelta(months = month_per)
于 2016-10-21T19:19:10.780 回答
0

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

从周期中添加和减去整数会使周期按其自身的频率移动。不同频率(跨度)的周期之间不允许进行算术运算。

原来答案其实很简单!假设您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')

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

于 2021-02-17T14:18:04.953 回答