【问题标题】:Pandas Date Range Overlap AggregationPandas 日期范围重叠聚合
【发布时间】:2020-12-13 14:07:15
【问题描述】:

我一直在尝试学习如何使用 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。在这一点上,一旦我有了共同的日期范围及其值,我想对该范围内的所有数字进行平均,这样最后我就有了变化始终为正或负的日期范围以及平均值每个范围的变化。我怎样才能做到这一点?

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    这是一种方式,IIUC(cmets 嵌入在下面的代码中):

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-02
      • 1970-01-01
      • 2015-11-18
      • 2016-11-23
      • 1970-01-01
      相关资源
      最近更新 更多