Pandas如何动态从主DataFrame生成各时点在场球员数据集
实现思路
原有代码的问题是仅匹配了initial_time等于当前时点的新增变动记录,没有覆盖存量在场球员。判断某时点t的在场球员核心逻辑非常直接:只要球员的某段位置/参赛记录满足记录起始时间早于等于t、记录结束时间晚于t,该球员就处于在场状态,对应的initial_position就是他在t时点的场上位置。
具体实现代码
如果你的时间字段是MM:SS格式的字符串,建议先转成数值类型做大小比较,避免字符串字典序比较带来的异常,完整代码如下:
import pandas as pd # 时间转数值:把"MM:SS"格式转为分钟数值,比如"45:00"转成45,"67:30"转成67.5 def ts2min(time_str): minute, second = map(int, time_str.split(":")) return minute + second / 60 # 新增数值类型的时间列,用于区间判断 df["init_min"] = df["initial_time"].apply(ts2min) df["end_min"] = df["ending_time"].apply(ts2min) # 提取所有需要生成快照的调整时间点 check_points = df["initial_time"].unique() # 遍历每个时点生成在场球员快照 snapshot_dict = {} for point in check_points: point_min = ts2min(point) # 筛选当前时点覆盖的在场记录 current_on_court = df[ (df["init_min"] <= point_min) & (df["end_min"] > point_min) ][["country", "player_name", "initial_position"]] # 去重后重置索引,避免异常重复数据 current_on_court = current_on_court.drop_duplicates().reset_index(drop=True) # 存入字典,key和你之前的命名逻辑保持一致,把时间里的冒号去掉避免key格式问题 snapshot_dict[f"df_{point.replace(':', '')}"] = current_on_court
使用方法
需要取某个时点的在场名单时,直接从字典里按key提取即可,比如取45:00的名单:
df_4500 = snapshot_dict["df_4500"]
注意事项
- 请提前确认数据逻辑:所有首发球员的
initial_time统一为开场时间(通常是00:00),所有终场离场记录的ending_time统一为终场时间(常规时间通常是90:00),这样生成的00:00快照就是完整首发名单,90:00前的最后一个调整时点快照也不会漏人。 - 该逻辑天然兼容换人、战术变阵、加时赛场景,只要原始记录里的
initial_time/ending_time能准确覆盖球员每一段位置状态的起止区间即可。 - 代码里的
drop_duplicates()是容错处理,正常数据不会触发,仅用于避免原始数据重复录入导致的名单异常。
内容的提问来源于stack exchange,提问作者dfahsjdahfsudaf
相关产品推荐
相关产品推荐

