使用Python查找连续日期
我有一个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.transform
和 diff
来检查日期是否连续,然后用 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