Python 将财政周数据聚合为每月金额(单位:

Python 将财政周数据聚合为每月金额(单位:,python,pandas,Python,Pandas,我有一个如下所示的数据集: YR_FW YIELD 0 201401 12.3 1 201402 10.2 2 201403 7.2 3 201404 8.0 4 201405 1.2 ... .... .... 96 201446 102.3 97 201447 101.7 98 201448 89.5 99 201449 72.2 100 201

我有一个如下所示的数据集:

      YR_FW    YIELD
0    201401     12.3
1    201402     10.2
2    201403     7.2
3    201404     8.0
4    201405     1.2
...  ....     ....
96   201446     102.3
97   201447     101.7
98   201448     89.5
99   201449     72.2
100  201450     88.0
101  201451     98.89
我想合计12个月。它可能看起来像这样:

Months    Summed_YLD
1            value
2            value
...         ...
11           value
12           value
注意:YR_FW有时缺少值。例如,
201427
不在数据框中


注2:如果案例重叠,则应将其汇总到月末。本周从周一开始,到周日结束(这不是一周5天)

我会首先将这些转换为日期时间:

In [11]: df["YR_FW"] = pd.to_datetime(df["YR_FW"].astype("str") + "-0", format="%Y%W-%w")

In [12]: df
Out[12]:
       YR_FW  YIELD
0 2014-01-12   12.3
1 2014-01-19   10.2
2 2014-01-26    7.2
3 2014-02-02    8.0
4 2014-02-09    1.2
请注意,
%W
指定一周从周一开始,
'-0'
指定一周内的周日开始。因此,结果日期将是指定的一周的最后一天

现在,您可以使用
dt
访问器提取一周中的最后一天:

In [13]: df.groupby(df["YR_FW"].dt.month).sum()
Out[13]:
       YIELD
YR_FW       
1       29.7
2        9.2

不幸的是,我没有足够的数据来全面检查代码,但这就是我现在要做的。如果我们假设我们有:

import pandas as pd
import numpy as np

df = pd.DataFrame({"YR_FW":[201401,201402,201403,201405,201506],"YIELD":[12.3,10.2,7.2,1.2,3.8]})

     YR_FW    YIELD
0    201401     12.3
1    201402     10.2
2    201403     7.2
3    201405     1.2
4    201506     3.8
缺少第三行以符合您的实际数据,并添加了不同的年份。我们可以采取以下行动:

df_pd_range = pd.period_range("01/01/2014","02/07/2016", freq="W") #Here you place the period of your data, I elongated till 2016 to test code
df.YR_FW = df.YR_FW.astype(str).map(lambda a_: a_[:4] + "-" + a_[4:])
a_ = [np.logical_and(df_pd_range.year == int(df.YR_FW.iloc[i][:4]),df_pd_range.week==int(df.YR_FW.iloc[i][5:])) for i in range(len(df))] #choose only the period that is present in the data
b_ = [df_pd_range[i][0] for i in a_]
arrays = [[i.year for i in b_],[i.month for i in b_] ]
index = pd.MultiIndex.from_arrays(arrays, names=["year", "month"])
df.set_index(index, inplace=True)
df.groupby(level=[0,1]).mean() #Here you obtain mean data grouped by week and year

告诉我进展如何

谢谢您的回复。请注意,“YR_FW”是每周值。因此,201402是一月的第二周,而不是二月。我想把52周的时间合并成12个月。@Rohit-hmmm,似乎%W或%U应该这样做,但对我来说似乎不起作用:/@Rohit-Ah-ha,你需要这样做:
pd.to_-datetime(df[“YR_-FW”)。astype(“str”)+“-0”,format=“%Y%W-%W”)
注意:astype可能不需要。是的,我不得不将类型更改为
str
,然后它才能工作。然而,这如何解决以下问题:(1)当一周与两个月重叠时会发生什么。它是如何聚合的?(2) 当有一个星期不见了?这些问题是由上面的root提出的,为了得到正确的答案,这些问题非常相关。谢谢@AndyHayden注释中的
到\u datetime
转换是正确的。
%W
指定一周从周一开始,
'-0'
指定一周内的周日开始。因此,结果日期将是指定的一周的最后一天。然后,当他在回答中做
groupby
时,它将累计到月末。如果一周与两个月重叠,会发生什么情况?是否应将这些值聚合到起始月份?月底?在这两个问题之间有分歧?另一个澄清:你的一周从哪一天开始?@root:这些都是很好的问题。如果案例重叠两周,您将累计到本月底。本周以星期日结束,因此从星期一开始。我会把这个加入我的问题。谢谢你解决这个问题。我想要安迪回答的熊猫的一切。它也很优雅。谢谢你的努力!