熊猫在grouby之后按日期时间过滤

时间:2020-10-28 14:39:13

标签: python pandas datetime pandas-groupby

按某个列对数据框进行分组后,我想选择分组列中每个键的最后一个值之前的一年前六个月中的日期。 例如,在此数据框中

df = pd.DataFrame([
  {'id': 'thing 1', 'date': '2016-01-01', 'quantity': 1 },
  {'id': 'thing 1', 'date': '2016-02-01', 'quantity': 1 },
  {'id': 'thing 1', 'date': '2016-09-01', 'quantity': 1 },
  {'id': 'thing 1', 'date': '2016-10-01', 'quantity': 1 },
  {'id': 'thing 2', 'date': '2017-01-01', 'quantity': 2 },
  {'id': 'thing 2', 'date': '2017-02-01', 'quantity': 2 },
  {'id': 'thing 2', 'date': '2017-02-11', 'quantity': 2 },
  {'id': 'thing 2', 'date': '2017-09-01', 'quantity': 2 },
  {'id': 'thing 2', 'date': '2017-10-01', 'quantity': 2 },
])
df.date = pd.to_datetime(df.date, format="%Y-%m-%d")
df

我想选择thing 1的前2行和thing 2的前3行。

我可以找到每个id的开始日期和结束日期:

df.groupby('id').date.max()-pd.DateOffset(years=1)
df.groupby('id').date.max()-pd.DateOffset(months=6)

但是我找不到在两者之间选择日期的方法。


我的最佳尝试(也是幼稚的尝试)在以下方面可能是错误的:

df[(df.groupby('id').date>(df.groupby('id').date.max()-pd.DateOffset(years=1))) & (df.groupby('id').date<(df.groupby('id').date.max()-pd.DateOffset(months=6)))]

可以理解地返回

TypeError:dtype = datetime64 [ns]与SeriesGroupBy之间的比较无效

2 个答案:

答案 0 :(得分:2)

您可以使用groupby.transform来获取每一行的最高日期。然后,我们用pd.DateOffset减去6个月,最后将其与Series.lt的每一行进行比较,less than<相同:

max_date = df.groupby('id')['date'].transform('max') - pd.DateOffset(months=6)
df[df['date'].lt(max_date)]
# or df[df['date'] < max_date]

输出

        id       date  quantity
0  thing 1 2016-01-01         1
1  thing 1 2016-02-01         1
4  thing 2 2017-01-01         2
5  thing 2 2017-02-01         2
6  thing 2 2017-02-11         2

答案 1 :(得分:0)

这可能是愚蠢的做法,但是...您可以根据现有日期在月份的df中添加新列。

df['MONTH'] = pd.DatetimeIndex(df['date']).month

它将在1月1日,2月2日等

然后在前六个月中过滤掉该列,其中|意味着或

df = df.loc[df['MONTH'] == 1]|[df['MONTH'] == 2]|[df['MONTH'] == 3]|[df['MONTH'] == 4]|[df['MONTH'] == 5]|[df['MONTH'] == 6]|