Pandas:如何对齐/居中一个日期列和聚合其他列的任一方向的日期?

6g8kf2rb  于 2022-11-27  发布在  其他
关注(0)|答案(1)|浏览(117)

如何基于事件(另一列值)对齐/居中 Dataframe (及其关联行)的日期列。
举例说明:我有一个数据框如下。
我尝试做的是 * 基于event列将日期列居中 *。在本例中,3/12/12是中心。
然后我需要center - 2months(21)和center + 2months(30.5)的平均值

df=pd.DataFrame([
        ['1/10/12',No, 20],
        ['2/11/12',No, 22],
        ['3/12/12',Yes, 29],
        ['4/14/12',No, 30],
        ['5/14/12',No, 31]
        ],
        columns=['Time', 'event', 'value'])

在上述情况下,生成的 Dataframe 将为:

df=pd.DataFrame([
        ['pre_center', 20],
        ['center', 22],
        ['post_center', 30.5]
        ],
        columns=['Range', 'average_value'])
sd2nnvve

sd2nnvve1#

您可以用途:

# convert to datetime
s = pd.to_datetime(df['Time'])

# identify the center
center = s[df['event'].eq('Yes')].iloc[0]

# identify if the date is before/center/after
group = (np.sign(s.sub(center).dt.days.astype(int))
           .map({-1: 'pre_center', 0: 'center', 1: 'post_center'})
        )

# aggregate
out = df.groupby(group)['value'].agg(average_value='sum')

输出量:

Range  average_value
0       center             29
1  post_center             61
2   pre_center             42

如果要包括阈值:

s = pd.to_datetime(df['Time'])

center = s[df['event'].eq('Yes')].iloc[0]

diff = pd.DateOffset(months=2)
m1 = s.between(center-diff, center)
m2 = s.between(center, center+diff)
group = np.select([m1&m2, m1, m2], ['center', 'pre_center', 'post_center'], np.nan)

out = (df.groupby(group)['value']
         .agg(average_value='sum')
         .drop('nan', errors='ignore')
         .rename_axis('Range').reset_index()
      )

输出量:

Range  average_value
0       center             29
1  post_center             30
2   pre_center             22

相关问题