1

我想对每年 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

然后我希望有一个新列来存储数据的值,如Sum每年每 6 个月的间隔,这样对于此示例,总和将 = 16。我尝试使用 and 的组合,df.groupby()df.sum()无法完全弄清楚。

预期的输出看起来像这样:

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
4

1 回答 1

3
idx = pd.Series(pd.date_range('1/1/2018', periods=100, freq='MS'),name='date')
df = pd.DataFrame(range(len(idx)), index=idx,columns=['A'])

过滤然后重新采样

>>> sums = df.loc[df.index.month.isin([1,2,3,4,5,6])].resample('YS').sum()
>>> sums['A'].values
array([ 15,  87, 159, 231, 303, 375, 447, 519, 390], dtype=int64)
>>> sums
              A
date           
2018-01-01   15
2019-01-01   87
2020-01-01  159
2021-01-01  231
2022-01-01  303
2023-01-01  375
2024-01-01  447
2025-01-01  519
2026-01-01  390
>>> 

我认为这date是您示例中的索引。如果是列更改,则需要在过滤器中使用dt访问resample器并在.

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

如果 DataFrame 仅包含每年的前六个月,则无需过滤。只是重新采样。

>>> 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
>>> 
于 2020-03-06T21:39:57.367 回答