Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用pandas显示给定日期的季度_Python_Pandas_Dataframe - Fatal编程技术网

Python 如何使用pandas显示给定日期的季度

Python 如何使用pandas显示给定日期的季度,python,pandas,dataframe,Python,Pandas,Dataframe,我正在尝试生成一个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 20

我正在尝试生成一个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年第4季度,我的季度数据都是正确的,但之后就搞砸了。在第53周,我得到2022年第一季度,以此类推。既然是闰年,那么第53周不是也应该是2021年第4季度吗?有谁能指导我如何纠正这一点吗

编辑

如果我还想为每个日期显示它所属的月份,该怎么办

最终df应如下所示

   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\u start
始终是一个会计年度的开始,您可以使用
for
循环执行此操作:

#生成一周到会计月的映射
m=np.roll(np.arange(1,13,dtype='int'),-3)
w=np.瓷砖([4,4,5],4)
会计月={
指数+1:月份
对于索引,枚举中的月份(np.重复(m,w))
}
会计月[53]=3#第53周,如果存在,则始终属于第3个月
#
数据=[]
y、 周=年\起始年,1
月=年\u开始。更换(月=4,日=1)
#如果从闰年开始,一个财政年度有53周。否则52周
num_week=lambda:53如果(y%4==0和y%100!=0)或(y%400==0)其他52
对于pd.date范围内的日期(开始年份、结束年份、频率为7D):
数据追加((日期+pd.Timedelta(天=6),y+1,周,月))
周+=1
如果周>周数():
y+=1
周=1
如果会计月[周]!=月。月:
月份+=月初偏移量月初(1)
df=pd.DataFrame(数据,列=['week\u end','fy','week\u no','acct\u month'])
#第一季度、第二季度和第三季度始终有13周
#第四季度可能有13或14周
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

我不明白为什么闰年和53周有关?在一年中,您始终有53周的演示时间(
365=7*52+1
)。365和366都不能平均除以7,因此,总有第53周的时间少于7天。您的数据最初是什么样子的?最初它的日期以周六结束,然后我将其与另一个数据框合并,该数据框包含给定范围内的所有日期,以查找周数。现在,我尝试用问题中的代码计算相应的季度。我实际上是在尝试创建一个4-4-5日历,但由于没有答案,我转向另一条路径来解决我的问题。这个问题可以在这里找到,谢谢你的回答。还有一个问题(因为我正在尝试实现一个4-4-5日历),是否可以使用相同的逻辑来查找它所属的每个日期对应的月份?例如,4月(会计年度的起始月)、7月、10月、1月、5月、8月、11月、2月始终有四周,然后是6月、9月、12月,有五周,而3月(会计年度的结尾)有五周或六周,这取决于年份是否为闰年。我想这可能类似于季度逻辑?你能帮我实现吗?我已经编辑了这个问题,我在其中添加了相应的月份栏。请参阅我编辑的答案,添加会计月份。非常感谢你的回答。有一个问题,什么是年度?不是财政年度的第一天?当我将您的代码更新为pd.date范围内的日期的
(年份开始、年份结束、freq='W-SAT'):
(因为日期总是在周六结束)时,我得到了错误的结果。有解决方法吗?哦,我想我明白了,在更改上述代码后,我还可以更新此行
数据。追加(日期,y+1,周,月)
,应该可以正常工作吧?