首页 > 解决方案 > Pandas 日期范围重叠聚合

问题描述

我一直在尝试学习如何使用 Pandas,但我完全不知道在 API 中的哪里可以找到可以根据日期范围内的符号有条件地聚合数据的方法。我有一个像这样的数据框:

Date        Change 
2010-08-25    0.08
2010-08-26   -0.22
2010-08-27    0.04
2010-08-30   -0.08
2010-08-31   -0.11
...            ...
2020-08-18    0.96
2020-08-19   -1.79
2020-08-20    5.04
2020-08-21   -0.84
2020-08-24   -1.10

Date 列当然是一个索引。我想做的基本上是按年份划分这些数据。一旦按年份分区,我想通过更改列的符号对连续的行进行分组,以便将连续的负数和连续的正数组合在一起。完成后,我想获得所有年份的日期范围与匹配符号的重叠。例如,如果从 2010-08-25 到 2010-08-27 和从 2011-08-26 到 2011-08-29 的变化是正的,那么常见的重叠将是 08-26 到 08-27,显然占所有年份不只是 2. 在这一点上,一旦我有了共同的日期范围及其值,我想对该范围内的所有数字进行平均,这样最后我就有了变化始终为正或负的日期范围以及平均值每个范围的变化。我怎样才能做到这一点?

标签: pythonpandasdataframe

解决方案


这是一种方法,IIUC(注释嵌入在下面的代码中):

from io import StringIO
import pandas as pd

data = '''Date        Change 
2010-08-25    0.08
2010-08-26   -0.22
2010-08-27    0.04
2010-08-30   -0.08
2010-08-31   -0.11
2020-08-18    0.96
2020-08-19   -1.79
2020-08-20    5.04
2020-08-21   -0.84
2020-08-24   -1.10
'''

# create data frame
df = pd.read_csv(StringIO(data), sep='\s+', 
                 engine='python', parse_dates=['Date'], 
                 index_col='Date')

# make a variable to segment positive vs negative changes
df['is_positive'] = (df['Change'] >= 0).astype(int)

# make a variable for the year
df['year'] = df.index.year

# groupby to calculate mean for each (year, is_positive)
# transform() returns same number of rows as original data
# (for illustration purposes)
df['mean_change'] = df.groupby(['year', 'is_positive'])['Change'].transform('mean')

# sort and print
df = df.sort_values(['year', 'is_positive', 'Change'])
print(df)

            Change  is_positive  year  mean_change
Date                                              
2010-08-26   -0.22            0  2010    -0.136667
2010-08-31   -0.11            0  2010    -0.136667
2010-08-30   -0.08            0  2010    -0.136667
2010-08-27    0.04            1  2010     0.060000
2010-08-25    0.08            1  2010     0.060000
2020-08-19   -1.79            0  2020    -1.243333
2020-08-24   -1.10            0  2020    -1.243333
2020-08-21   -0.84            0  2020    -1.243333
2020-08-18    0.96            1  2020     3.000000
2020-08-20    5.04            1  2020     3.000000

推荐阅读