如何按shortId的创建日期筛选其后7天内的游戏数据?
解决按shortId创建日期筛选7天内游戏记录的问题
我来帮你搞定这个筛选需求,用Python的pandas库就能轻松实现,完全不用复杂的30天切片操作。咱们一步步来:
原始数据集
先把你提供的原始数据整理成清晰的表格:
| shortId | Created_date | pid1 | pid2 | Game_Play_Date |
|---|---|---|---|---|
| abc | 01-05-19 | abc | def | 01-05-19 |
| abc | 01-05-19 | abc | pqr | 01-05-19 |
| abc | 01-05-19 | xyz | abc | 02-05-19 |
| abc | 01-05-19 | qwe | abc | 03-05-19 |
| abc | 01-05-19 | pqr | abc | 04-05-19 |
| xyz | 02-05-19 | def | xyz | 02-05-19 |
| xyz | 02-05-19 | pqr | xyz | 07-05-19 |
| xyz | 02-05-19 | xyz | pqr | 07-05-19 |
| xyz | 02-05-19 | xyz | abc | 15-05-19 |
| xyz | 02-05-19 | xyz | def | 21-05-19 |
实现步骤
核心思路是:先把日期字符串转成可计算的datetime类型,然后按每个shortId的创建日期,筛选游戏日期在7天窗口内的记录。
1. 导入库并加载数据
首先导入pandas,把数据加载成DataFrame:
import pandas as pd # 加载你的数据 data = { 'shortId': ['abc', 'abc', 'abc', 'abc', 'abc', 'xyz', 'xyz', 'xyz', 'xyz', 'xyz'], 'Created_date': ['01-05-19', '01-05-19', '01-05-19', '01-05-19', '01-05-19', '02-05-19', '02-05-19', '02-05-19', '02-05-19', '02-05-19'], 'pid1': ['abc', 'abc', 'xyz', 'qwe', 'pqr', 'def', 'pqr', 'xyz', 'xyz', 'xyz'], 'pid2': ['def', 'pqr', 'abc', 'abc', 'abc', 'xyz', 'xyz', 'pqr', 'abc', 'def'], 'Game_Play_Date': ['01-05-19', '01-05-19', '02-05-19', '03-05-19', '04-05-19', '02-05-19', '07-05-19', '07-05-19', '15-05-19', '21-05-19'] } df = pd.DataFrame(data)
2. 转换日期格式
把Created_date和Game_Play_Date从字符串转为datetime类型,指定格式为%d-%m-%y(日-月-年):
df['Created_date'] = pd.to_datetime(df['Created_date'], format='%d-%m-%y') df['Game_Play_Date'] = pd.to_datetime(df['Game_Play_Date'], format='%d-%m-%y')
3. 计算日期差并筛选
对每条记录,计算游戏日期与该shortId创建日期的间隔天数,然后筛选间隔≥0(包含创建当天)且≤7的记录:
# 按shortId分组,获取每个shortId对应的创建日期(这里每个shortId的创建日期唯一,所以取第一个值即可) created_dates = df.groupby('shortId')['Created_date'].first() # 映射每条记录的创建日期 df['group_created_date'] = df['shortId'].map(created_dates) # 计算天数差 df['days_diff'] = (df['Game_Play_Date'] - df['group_created_date']).dt.days # 筛选符合条件的记录:天数差在0到7之间(包含两端) filtered_df = df[(df['days_diff'] >= 0) & (df['days_diff'] <= 7)].drop(columns=['group_created_date', 'days_diff']) # 重置索引(可选,让结果更整洁) filtered_df = filtered_df.reset_index(drop=True)
4. 查看结果
打印筛选后的结果,和你期望的完全一致:
print(filtered_df)
输出结果:
shortId Created_date pid1 pid2 Game_Play_Date 0 abc 2019-05-01 abc def 2019-05-01 1 abc 2019-05-01 abc pqr 2019-05-01 2 abc 2019-05-01 xyz abc 2019-05-02 3 abc 2019-05-01 qwe abc 2019-05-03 4 abc 2019-05-01 pqr abc 2019-05-04 5 xyz 2019-05-02 def xyz 2019-05-02 6 xyz 2019-05-02 pqr xyz 2019-05-07 7 xyz 2019-05-02 xyz pqr 2019-05-07
如果你的数据量很大,这个方法也能高效处理,完全不需要复杂的切片操作~
内容的提问来源于stack exchange,提问作者Abhas Mehrotra
相关产品推荐
相关产品推荐

