熊猫日期范围重叠汇总

时间:2020-08-24 22:19:23

标签: python pandas dataframe

我一直在尝试学习如何使用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

日期列当然是一个索引。我要做的基本上是按年份划分此数据。按年份划分后,我想按change列的符号对连续的行进行分组,以便将连续的负数和连续的正数分组在一起。完成后,我想获得所有年份的日期范围与符号匹配的重叠部分。例如,如果从2010-08-25到2010-08-27以及2011-08-26到2011-08-29的变化是正的,则常见的重叠范围是08-26到08-27,这显然是所有年份的结果不仅是2。那时候,一旦我有了通用的日期范围及其值,我就希望对该范围内的所有数字取平均值,以使最后我得到的日期范围内的变化始终为正或负,并且平均值改变每个范围。我该如何实现?

1 个答案:

答案 0 :(得分:0)

这是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