使用Python查找连续日期

1 投票
1 回答
45 浏览
提问于 2025-04-14 15:56

我有一个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

1 个回答

0

使用 groupby.transformdiff 来检查日期是否连续,然后用 shift 将结果向后移动一步,以便包含起始行,最后进行 布尔索引

# ensure datetime (NOT date!)
df['Game_date'] = pd.to_datetime(df['Game_date'])

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

# select
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

中间结果(这里有两个额外的日期,用来展示每个玩家的多次连续情况):

         Player  Game_date    diff      m m.shift(-1)  m|m.shift(-1)
0  Lebron James 2023-10-11     NaT  False        True           True
1  Lebron James 2023-10-12  1 days   True       False           True
2  Lebron James 2023-10-18  6 days  False         NaN          False
3   Kobe Bryant 2023-11-02     NaT  False        True           True
4   Kobe Bryant 2023-11-03  1 days   True       False           True
5   Kobe Bryant 2023-11-09  6 days  False       False          False
6   Kobe Bryant 2023-12-11 32 days  False        True           True
7   Kobe Bryant 2023-12-12  1 days   True         NaN           True

撰写回答