使用 Python 查找连续日期

问题描述 投票:0回答:1

我有一个 NBA 数据集,如下所示:

玩家 比赛日期
勒布朗·詹姆斯 2023-10-11
勒布朗·詹姆斯 2023-10-12
勒布朗·詹姆斯 2023-10-18
科比·布莱恩特 2023-11-02
科比·布莱恩特 2023-11-03
科比·布莱恩特 2023-11-09

我想过滤它,使其只包含背靠背的比赛,这样它看起来像这样:

玩家 比赛日期
勒布朗·詹姆斯 2023-10-11
勒布朗·詹姆斯 2023-10-12
科比·布莱恩特 2023-11-02
科比·布莱恩特 2023-11-03

请将此视为我的整个数据集的一个片段,因此我希望找到一种方法来过滤整个数据集,而不是仅过滤这个小片段。

如果你想创建数据框:

data = [
{'Player': 'Lebron James', 'Game_date': '2023-10-11'},
{'Player': 'Lebron James', 'Game_date': '2023-10-12'},
{'Player': 'Lebron James', 'Game_date': '2023-10-18'},
{'Player': 'Kobe Bryant', 'Game_date': '2023-11-02'},
{'Player': 'Kobe Bryant', 'Game_date': '2023-11-03'},
{'Player': 'Kobe Bryant', 'Game_date': '2023-11-09'},
]
df = pd.DataFrame(data)
print(df)

我尝试这样做:

# Convert 'game_date' column to datetime format
df['game_date'] = pd.to_datetime(df['game_date']).dt.date

# Sort DataFrame by player_id and game_date
df.sort_values(by=['player_name', 'game_date'], inplace=True)

# Calculate the difference between consecutive game dates and store the result in 'b2b' column
df['b2b'] = df.groupby('player_name')['game_date'].apply(lambda x:x.diff().fillna(pd.Timedelta(days=0))).dt.days
python pandas date filter
1个回答
0
投票

使用

groupby.transform
diff
检查日期是否连续,然后
shift
将掩码向后移动一步以包含起始行:

df['Game_date'] = pd.to_datetime(df['Game_date'])

keep = (df.groupby('Player')['Game_date']
          .transform(lambda g: (m:=g.diff().dt.days.eq(1)) | m.shift(-1))
       )

out = df.loc[keep]

输出:

         Player  Game_date
0  Lebron James 2023-10-11
1  Lebron James 2023-10-12
3   Kobe Bryant 2023-11-02
4   Kobe Bryant 2023-11-03
© www.soinside.com 2019 - 2024. All rights reserved.