Python 熊猫每年对特定月份范围内的每个值求和

Python 熊猫每年对特定月份范围内的每个值求和,python,pandas,dataframe,Python,Pandas,Dataframe,我想对每年1月到6月的数据进行汇总。我有一个如下所示的数据帧: Date Value 1980-01-01 2 1980-02-01 3 1980-03-01 3 1980-04-01 2 1980-05-01 3 1980-06-01 3 Date Value Sum 1980-01-01 2 16 1980-02-01 3 1980-03-01 3 1980-04-01 2 1980-05-01 3 1980-06-01 3 然后,我希望有一个新的

我想对每年1月到6月的数据进行汇总。我有一个如下所示的数据帧:

Date       Value
1980-01-01 2
1980-02-01 3
1980-03-01 3
1980-04-01 2
1980-05-01 3
1980-06-01 3
Date       Value   Sum
1980-01-01 2       16
1980-02-01 3
1980-03-01 3
1980-04-01 2
1980-05-01 3
1980-06-01 3
然后,我希望有一个新的列,将数据值存储为每年每隔6个月的
Sum
,这样在本例中,Sum将=16。我尝试使用
df.groupby()
df.sum()
的组合,但没有完全理解

预期输出如下所示:

Date       Value
1980-01-01 2
1980-02-01 3
1980-03-01 3
1980-04-01 2
1980-05-01 3
1980-06-01 3
Date       Value   Sum
1980-01-01 2       16
1980-02-01 3
1980-03-01 3
1980-04-01 2
1980-05-01 3
1980-06-01 3
然后过滤


我假设
date
是您示例中的索引。如果是列更改,则需要在筛选器中使用,并在
重采样中指定列名

dfa = pd.DataFrame({'date':idx,'A':range(len(idx))})
>>> sums = dfa.loc[dfa.date.dt.month.isin([1,2,3,4,5,6])].resample('YS',on='date').sum()
>>> sums['A'].values
array([ 15,  87, 159, 231, 303, 375, 447, 519, 390], dtype=int64)
你也可以按六个月的频率重新取样/汇总,然后每隔一次就取一次结果——即使序列中缺少几个月,这似乎也能奏效

>>> dfq = dfa.loc[::2]
>>> dfq.head()
        date  A
0 2018-01-01  0
2 2018-03-01  2
4 2018-05-01  4
6 2018-07-01  6
8 2018-09-01  8
>>> dfc = dfq.resample('6MS', on='date').sum()
>>> dfc.loc[::2].head()
              A
date           
2018-01-01    6
2019-01-01   42
2020-01-01   78
2021-01-01  114
2022-01-01  150

如果数据帧仅包含每年的前六个月,则不需要进行筛选。只需重新采样

>>> dfb = dfa.loc[dfa.date.dt.month.isin([1,2,3,4,5,6])]
>>> dfb.resample('YS',on='date').sum().head()
              A
date           
2018-01-01   15
2019-01-01   87
2020-01-01  159
2021-01-01  231
2022-01-01  303
>>> 
然后过滤


我假设
date
是您示例中的索引。如果是列更改,则需要在筛选器中使用,并在
重采样中指定列名

dfa = pd.DataFrame({'date':idx,'A':range(len(idx))})
>>> sums = dfa.loc[dfa.date.dt.month.isin([1,2,3,4,5,6])].resample('YS',on='date').sum()
>>> sums['A'].values
array([ 15,  87, 159, 231, 303, 375, 447, 519, 390], dtype=int64)
你也可以按六个月的频率重新取样/汇总,然后每隔一次就取一次结果——即使序列中缺少几个月,这似乎也能奏效

>>> dfq = dfa.loc[::2]
>>> dfq.head()
        date  A
0 2018-01-01  0
2 2018-03-01  2
4 2018-05-01  4
6 2018-07-01  6
8 2018-09-01  8
>>> dfc = dfq.resample('6MS', on='date').sum()
>>> dfc.loc[::2].head()
              A
date           
2018-01-01    6
2019-01-01   42
2020-01-01   78
2021-01-01  114
2022-01-01  150

如果数据帧仅包含每年的前六个月,则不需要进行筛选。只需重新采样

>>> dfb = dfa.loc[dfa.date.dt.month.isin([1,2,3,4,5,6])]
>>> dfb.resample('YS',on='date').sum().head()
              A
date           
2018-01-01   15
2019-01-01   87
2020-01-01  159
2021-01-01  231
2022-01-01  303
>>> 


你能显示你的预期产出吗?我编辑了预期产出的问题。你的数据中有不同的月/年?类似于
df.loc[df[“Date”].dt.month.le(6)].groupby(df[“Date”].dt.year)[“Value”].transform('sum'))
我将如何更改它…
-使用
isin
而不是
le
,并指定一个整数序列。你能显示你的预期输出吗?我编辑了预期输出的问题。你的数据中有不同的月/年?类似于
df.loc[df[“Date”].dt.month.le(6)].groupby(df[“Date”].dt.year)[“值”]。转换('sum')
我将如何更改它…
-使用
isin
而不是
le
,并指定一个整数序列。我得到一个错误:“Int64Index”对象没有属性“month”,如果它有任何区别,我编辑了我的数据框,使其仅包含每年前6个月的数据。因此,1980年1月-6月,然后是1981年1月-6月,等等。然后我该如何每6个月对数据进行一次汇总,但不使其成为历年的累计汇总?@EliTurasky-欢迎光临。这不是一个讨论论坛或教程。请花点时间阅读和阅读该页面上的其他链接。请不要不断修改问题。很公平。谢谢您的回复是。我得到了这个错误:“Int64Index”对象没有属性“month”,如果它有任何区别,我编辑了我的数据框,只包含每年前6个月的数据。那么1980年1月-6月,然后是1981年1月-6月,等等。那么我如何每6个月对数据求和一次,但不使其成为所有年份的累积和?@EliTurasky-欢迎来到SO。这不是一个讨论论坛或教程。请花时间阅读和阅读该页面上的其他链接。请不要不断修改问题。足够公平。谢谢。