python - 是否可以获得周期索引或周期范围的日期-年份属性?
问题描述
我想获得一家公司的财政年度,该公司的季度在该季度的最后一个星期五结束,该季度的财政年度开始是 5 月,财政年度结束月份是 4 月。当我询问 Periodindex 的日历年属性时,我得到了季度末的日历年(我明白为什么并且我可以得到季度开始)。但是,我可以在设置我的财政季度的同时解决这个问题吗?
日期列表 - 测试数据
first_date = datetime(2017, 1, 1)
last_date = datetime(2019, 9, 20)
x = 30
list_of_dates = [date for date in np.arange(first_date, last_date, timedelta(days=x)).astype(datetime)]
创建数据框
df = pd.DataFrame({'dates': list_of_dates})
创建索引
idx = pd.PeriodIndex(df.dates, freq='Q-APR')
df['fscl_YrQtr'] = idx
df['calendar_Yr'] = idx.year
df['fscl_Yr'] = idx.qyear
df['fscl_Qtr'] = idx.quarter
以下所有工作,除了最后一个 (df['fscl_year_huh']) 连续给我 2018 年。我想不通那个。
df['Q_end_date'] = [date - pd.tseries.offsets.DateOffset(days=1) + pd.tseries.offsets.FY5253Quarter(normalize=True, weekday=4,startingMonth=4, qtr_with_extra_week=1, variation='last') for date in df.dates]
df['fscl_year_quarter'] = pd.PeriodIndex([date - pd.tseries.offsets.DateOffset(days=1) + pd.tseries.offsets.FY5253Quarter(normalize=True, weekday=4,startingMonth=4, qtr_with_extra_week=1, variation='last') for date in df.dates], freq='Q-APR')
df['month'] = df.dates.dt.month
df['year'] = df.dates.dt.year
df['fscl_days_of_period'] = pd.PeriodIndex([date - pd.tseries.offsets.DateOffset(days=1) + pd.tseries.offsets.FY5253Quarter(normalize=True, weekday=4,startingMonth=4, qtr_with_extra_week=1, variation='last') for date in df.dates], freq='Q-APR').day
df['fscl_quarter_num'] = pd.PeriodIndex([date - pd.tseries.offsets.DateOffset(days=1) + pd.tseries.offsets.FY5253Quarter(normalize=True, weekday=4,startingMonth=4, qtr_with_extra_week=1, variation='last') for date in df.dates], freq='Q-APR').quarter
df['fscl_year_huh'] = pd.PeriodIndex([date - pd.tseries.offsets.DateOffset(days=1) + pd.tseries.offsets.FY5253Quarter(normalize=True, weekday=4,startingMonth=4, qtr_with_extra_week=1, variation='last') for date in df.dates], freq='Q-APR').year
解决方案
我不知道这是否是 pythonic,但我通过利用 loc 解决了这个问题:
df.loc[((df.dates.dt.month >= 5) | ((df.dates.dt.month == 4) & (df['fscl_quarter_num'] == 1))), 'fiscl_year'] = df.dates.dt.year + 1
df.loc[((df.dates.dt.month <= 4) & (df['fscl_quarter_num'] != 1)), 'fiscl_year'] = df.dates.dt.year
5 月或以后的任何月份都会出现财政年度增长。财政月在月底之前结束的 4 月的任何月份,该月底的财政季度将是 1。
推荐阅读
- ios - 原子属性包装器仅在声明为类而不是结构时才有效
- cql - ScyllaDB窗口函数式查询
- python - 使用 mysql.connector 时出现 MySQL 错误 1064 (42000)
- terraform - Terraform for_each?
- c# - 寻求帮助尝试从两个不同的类打印类属性到控制台,但在输入时保持它们配对
- .net - 当需要 Long 类型的参数时,为什么我可以传递 Integer?
- elasticsearch - "tags":["_dateparsefailure"]," 与 logstash
- regex - powershell 正则表达式匹配特定字符串,没有开始特殊字符
- c# - C# Windows 服务 - 我的计时器不工作,获得多个线程
- node.js - Express 路由器 app.all('*', (req, res, next)) 不会在 ec2 实例上执行 HTTP 请求。获取请求超时错误