Python数据操作:如何按ID分组,然后根据每个组中的datatime条件向前/向后1个月子集行?

Python数据操作:如何按ID分组,然后根据每个组中的datatime条件向前/向后1个月子集行?,python,pandas,time-series,Python,Pandas,Time Series,我想在groupby之后对数据进行子集划分,并根据datatime条件向前和向后1个月对行进行子集划分 以下是测试数据帧: import pandas as pd from itertools import chain df_1 = pd.DataFrame({ 'ID' : list(chain.from_iterable([['A'] * 365, ['B'] * 365, ['C'] * 365])), 'Date' : pd.date_range(s

我想在groupby之后对数据进行子集划分,并根据datatime条件向前和向后1个月对行进行子集划分

以下是测试数据帧:


import pandas as pd
from itertools import chain


df_1 = pd.DataFrame({
        'ID' : list(chain.from_iterable([['A'] * 365, ['B'] * 365, ['C'] * 365])),
        'Date' : pd.date_range(start = '2018-01-01', end = '2018-12-31').tolist() + pd.date_range(start = '2018-01-01', end = '2018-12-31').tolist() + pd.date_range(start = '2018-01-01', end = '2018-12-31').tolist(),
        'Value' : np.random.randn(365 * 3)
        })

df_2 = pd.DataFrame({
        'ID' : ['A', 'B', 'C'],
        'Initial_date' : pd.to_datetime(['2018-04-24', '2018-09-22', '2018-12-12'], format = '%Y-%m-%d')
        })


df = pd.merge(df_1, df_2, how = 'left', left_on = 'ID', right_on = 'ID')

测试数据帧的输出为:

  ID       Date  Value Initial_date
0  A 2018-01-01 -1.084   2018-04-24
1  A 2018-01-02  0.585   2018-04-24
2  A 2018-01-03  0.812   2018-04-24
3  A 2018-01-04 -1.115   2018-04-24
4  A 2018-01-05 -1.724   2018-04-24

这就是我想要的:

对于
A
用户,他的
初始日期是
2018-04-24
,因此我希望所有行从向后1个月(即
2018-03-24
)到向前1个月(即
2018-05-24
)。 以及
B
C
用户

结果应该与

df_a = df[(df['ID'] == 'A') & (df['Date'] > '2018-03-23') & (df['Date'] < '2018-05-25')]

df_b = df[(df['ID'] == 'B') & (df['Date'] > '2018-08-21') & (df['Date'] < '2018-10-23')]

df_c = df[(df['ID'] == 'C') & (df['Date'] > '2018-11-11') & (df['Date'] < '2018-12-31')]


df_result = pd.concat([df_a, df_b, df_c])
注*1:对于边际日期,不一定包括或排除确切日期。例如,对于
A
,来自
2018-03-23
2018-03-24
的信息对我来说并不重要


注*2:对于
C
用户,自其
初始日期
2018-12-12
以来,向前日期少于1个月,因此到2018年底是可以的。

IIUC,您可以尝试以下操作:

# set 1-month interval
delta = pd.DateOffset(months=1) 

# get the subset
df_result = df[df.Date.gt(df.Initial_date-delta) & df.Date.lt(df.Initial_date+delta)] 

这个解决方案是优雅和惊人的!我想我会在原始数据集上使用这个。然而,我也试图通过使用
groupby
来获得相同的结果,因为我试图理解Python的
groupby
的逻辑和用法,希望使用
groupby
能够找到答案。
# set 1-month interval
delta = pd.DateOffset(months=1) 

# get the subset
df_result = df[df.Date.gt(df.Initial_date-delta) & df.Date.lt(df.Initial_date+delta)]