- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试生成 4-4-5 日历。我有来自 29-03-2020
的日期数据框至 2022-04-09
由它们的等效周数组成。 29-03-2020
是会计年度的开始日期。我正在尝试生成一个包含它们所属季度的列。
这是我正在寻找的最终 df,
a | count | quarter
2020-04-04 | 1 | Q1 2021
2020-04-11 | 2 | Q1 2021
.
.
.
2021-03-27 | 52 | Q4 2021
2021-04-03 | 53 | Q4 2021 #since 2020 is a leap year there are 53 weeks otherwise it will be 52 weeks
2021-04-10 | 1 | Q1 2022
2021-04-17 | 2 | Q1 2022
.
2022-03-02 | 52 | Q4 2022
2022-04-09 | 1 | Q1 2023
我做了以下尝试,
import pandas as pd
import numpy as np
year_start = '2020-03-29'
year_end = '2022-04-09'
week_end_sat = pd.DataFrame(pd.date_range(year_start, year_end, freq=f'W-SAT'), columns=['a'])
first_day_of_year = week_end_sat.iloc[0, 0].replace(day=1, month=1)
baseline = pd.DataFrame(pd.date_range(first_day_of_year, periods=len(week_end_sat), freq=f'W-SAT'), columns=['a'])
week_end_sat['count'] = baseline['a'].dt.isocalendar().week
week_end_sat['quarter'] = 'Q' + baseline['a'].dt.quarter.astype(str) + ' ' + (baseline['a'].dt.year+1).astype(str)
week_end_sat['b'] = baseline['a']
all_days_df = pd.DataFrame(pd.date_range(year_start, year_end), columns=['a'])
merge_df = pd.merge(all_days_df,week_end_sat, on='a', how='left')
merge_df['count'] = merge_df['count'].bfill()
merge_df['quarter'] = merge_df['quarter'].bfill()
merge_df['week_day'] = merge_df['a'].dt.day_name()
在第 52 周(即 2021 年第四季度)之前,我的季度都是正确的,但在那之后就搞砸了。第 53 周,我得到 2022 年第一季度,依此类推。因为是闰年,所以第 53 周不应该也是 2021 年第四季度吗?任何人都可以指导我纠正这个问题吗?
a | count | quarter | month
2020-04-04 | 1 | Q1 2021 | 2020-04
2020-04-11 | 2 | Q1 2021 | 2020-04
.
.
.
2021-03-27 | 52 | Q4 2021 | 2021-03
2021-04-03 | 53 | Q4 2021 | 2021-03
2021-04-10 | 1 | Q1 2022 | 2021-04
2021-04-17 | 2 | Q1 2022 | 2021-04
.
2022-03-02 | 52 | Q4 2022 | 2022-03
2022-04-09 | 1 | Q1 2023 | 2022-04
最佳答案
假设 year_start
始终是财政年度的开始,您可以使用 for
来做到这一点。环形:
# Generate a week-to-accounting-month mapping
m = np.roll(np.arange(1, 13, dtype='int'), -3)
w = np.tile([4,4,5], 4)
acct_month = {
index + 1: month
for index, month in enumerate(np.repeat(m, w))
}
acct_month[53] = 3 # week 53, if exists, always belong to month 3
#
data = []
y, week = year_start.year, 1
month = year_start.replace(month=4, day=1)
# A fiscal year has 53 weeks if it starts on a leap year. 52 weeks otherwise
num_week = lambda: 53 if (y % 4 == 0 and y % 100 != 0) or (y % 400 == 0) else 52
for date in pd.date_range(year_start, year_end, freq='7D'):
data.append((date + pd.Timedelta(days=6), y+1, week, month))
week += 1
if week > num_week():
y += 1
week = 1
if acct_month[week] != month.month:
month += pd.offsets.MonthBegin(1)
df = pd.DataFrame(data, columns=['week_end', 'fy', 'week_no', 'acct_month'])
# Q1, Q2 and Q3 always have 13 weeks
# Q4 may have 13 or 14 weeks
q = np.ceil(df['week_no'].div(13).clip(upper=4)).astype('int')
df['quarter'] = 'Q' + q.astype(str) + ' ' + df['fy'].astype(str)
结果:
week_end fy week_no acct_month quarter
0 2020-04-04 2021 1 2020-04-01 Q1 2021
1 2020-04-11 2021 2 2020-04-01 Q1 2021
2 2020-04-18 2021 3 2020-04-01 Q1 2021
3 2020-04-25 2021 4 2020-04-01 Q1 2021
...
48 2021-03-06 2021 49 2021-03-01 Q4 2021
49 2021-03-13 2021 50 2021-03-01 Q4 2021
50 2021-03-20 2021 51 2021-03-01 Q4 2021
51 2021-03-27 2021 52 2021-03-01 Q4 2021
52 2021-04-03 2021 53 2021-03-01 Q4 2021
53 2021-04-10 2022 1 2021-04-01 Q1 2022
54 2021-04-17 2022 2 2021-04-01 Q1 2022
55 2021-04-24 2022 3 2021-04-01 Q1 2022
...
100 2022-03-05 2022 48 2022-03-01 Q4 2022
101 2022-03-12 2022 49 2022-03-01 Q4 2022
102 2022-03-19 2022 50 2022-03-01 Q4 2022
103 2022-03-26 2022 51 2022-03-01 Q4 2022
104 2022-04-02 2022 52 2022-03-01 Q4 2022
105 2022-04-09 2023 1 2022-04-01 Q1 2023
关于python - 如何使用 Pandas 显示给定日期的季度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67062561/
我有以下数据框: Data <- data.frame( date = c("2001-01-01", "2001-02-01", "2001-03-01", "2001-04-01", "200
我在基于 [Date] 字段的选择查询中使用这些公式。学期为 1 月至 6 月 1 个学期,7 月至 12 月为 2 个学期。季度是 3 个月的版本(1 月至 3 月等为 1)。 case when
我有一些用户上传的数据,需要根据用户选择的时间段进行存储和排序。期间应该只支持月年或季度年,没有其他,类似于下面: +----+---------+-------+ | id | pe
我有一个 pandas DataFrame,其中有一列(标题)需要被解析为日期时间对象,以便我可以将其转换为时间序列。 Title Gross Domestic Product: Quar
oracle按天,周,月,季度,年查询排序 ? 1
我有 32 年的数据要放入分区表中。但是 BigQuery 说我超过了限制(4000 个分区)。 对于像这样的查询: CREATE TABLE `deleting.day_partition` PAR
我们将从以下数据表开始: id date 1: 1 2016-03-31 2: 1 2015-12-31 3: 1 2015-09-30 4: 1 2015-06-
我知道与计划相关的里程碑的年份和季度(例如“2010”和“4”),并且我想从中选择/创建一个日期时间。有许多巧妙的方法可以用特定日期的格式(“qq”)来识别季度,但不能反过来(或者有吗?)。这是使用
我需要获得给定日期的相应三个月(3 个月的时间段,即 1 月、2 月和 3 月的第一个三个月)。使用 c# System.DateTime 结构我没有设法找到我正在寻找的方法。所以我这样解决了: Da
我的数据集包含 48 周内每一天的信息。[我的数据集截图][1] 我希望创建一个名为“quarter”的新变量,将每一个week变量值=1-12的观测值标记为“a”,意思是“第一季度”;另外,将每个周
我正在寻找一个 java 库,当给出起始日期和截止日期时,它将返回最适用的日期列表(以周、月、季度或年为单位)。我已经手动完成了这项工作,我想知道这是否已经作为标准包的一部分实现和测试。 例子 给定
我想做两件事: 我想将 x 轴格式设置为四分之一。我的时间序列数据以季度为单位。例如,对于日期 2012-12-31 我希望它显示为 2012Q4,对于 2013-03-31 作为 2013Q1 ,对
我是一名优秀的程序员,十分优秀!