如何将 pandas 重采样到水文年(9 月 1 日 - 8 月 31 日)

How to resample pandas to hydrologic year (Sep 1 - Aug 31)

我想按水文年分析一些每日数据:从 9 月 1 日到 8 月 31 日。我创建了一个合成数据集:

import pandas as pd

t = pd.date_range(start='2015-01-01', freq='D', end='2021-09-03')
df = pd.DataFrame(index = t)

df['hydro_year'] = df.index.year
df['hydro_year'].loc[df.index.month >= 9] += 1

df['id'] = df['hydro_year'] - df.index.year[0]
df['count'] = 1

请注意,实际上我没有 hydro_year 列,所以我不使用 groupby。我希望以下内容按水文年重新采样:

print(df['2015-09-01':].resample('12M').agg({'hydro_year':'mean','id':'mean','count':'sum'}))

但输出不对齐:

|                     | hydro_year |      id | count |
|---------------------+------------+---------+-------|
| 2015-09-30 00:00:00 |       2016 |       1 |    30 |
| 2016-09-30 00:00:00 |    2016.08 | 1.08197 |   366 |
| 2017-09-30 00:00:00 |    2017.08 | 2.08219 |   365 |
| 2018-09-30 00:00:00 |    2018.08 | 3.08219 |   365 |
| 2019-09-30 00:00:00 |    2019.08 | 4.08219 |   365 |
| 2020-09-30 00:00:00 |    2020.08 | 5.08197 |   366 |
| 2021-09-30 00:00:00 |    2021.01 | 6.00888 |   338 |

但是,如果我早一天开始,那么事情就会一致,除了第一天是 'early' 并且单独悬空...

|                     | hydro_year | id | count |
|---------------------+------------+----+-------|
| 2015-08-31 00:00:00 |       2015 |  0 |     1 |
| 2016-08-31 00:00:00 |       2016 |  1 |   366 |
| 2017-08-31 00:00:00 |       2017 |  2 |   365 |
| 2018-08-31 00:00:00 |       2018 |  3 |   365 |
| 2019-08-31 00:00:00 |       2019 |  4 |   365 |
| 2020-08-31 00:00:00 |       2020 |  5 |   366 |
| 2021-08-31 00:00:00 |       2021 |  6 |   365 |
| 2022-08-31 00:00:00 |       2022 |  7 |     3 |

IIUC,可以用12MS(开始)代替12M:

>>> df['2015-09-01':].resample('12MS') \
                     .agg({'hydro_year':'mean','id':'mean','count':'sum'})

            hydro_year   id  count
2015-09-01      2016.0  1.0    366
2016-09-01      2017.0  2.0    365
2017-09-01      2018.0  3.0    365
2018-09-01      2019.0  4.0    365
2019-09-01      2020.0  5.0    366
2020-09-01      2021.0  6.0    365
2021-09-01      2022.0  7.0      3

我们可以尝试每年 Anchored Offsets 从 SEP 开始:

resampled_df = df['2015-09-01':].resample('AS-SEP').agg({
    'hydro_year': 'mean', 'id': 'mean', 'count': 'sum'
})
            hydro_year   id  count
2015-09-01      2016.0  1.0    366
2016-09-01      2017.0  2.0    365
2017-09-01      2018.0  3.0    365
2018-09-01      2019.0  4.0    365
2019-09-01      2020.0  5.0    366
2020-09-01      2021.0  6.0    365
2021-09-01      2022.0  7.0      3