Python案例:判断上半场是否有进球产生
这是一个常见的体育数据分析问题,下面我用一个完整的Python案例来演示如何判断足球比赛上半场是否有进球。

问题分析
要判断上半场是否有进球,需要知道:
- 上半场的进球事件(时间 ≤ 45分钟,含补时)
- 可以通过上半场结束时的比分,或进球事件列表来判断
基础案例
案例1:通过比分判断
def has_first_half_goal(half_time_score):
"""
通过半场比分判断上半场是否有进球
:param half_time_score: 元组 (主队进球, 客队进球)
:return: True/False
"""
home_goals, away_goals = half_time_score
return (home_goals + away_goals) > 0
# 测试
matches = [
("比赛A", (1, 0)),
("比赛B", (0, 0)),
("比赛C", (2, 1)),
("比赛D", (0, 0)),
]
for name, score in matches:
result = "有进球 ✅" if has_first_half_goal(score) else "无进球 ❌"
print(f"{name} 半场比分 {score} → 上半场{result}")
输出:
比赛A 半场比分 (1, 0) → 上半场有进球 ✅
比赛B 半场比分 (0, 0) → 上半场无进球 ❌
比赛C 半场比分 (2, 1) → 上半场有进球 ✅
比赛D 半场比分 (0, 0) → 上半场无进球 ❌
案例2:通过进球事件列表判断(更真实)
实际数据通常是进球事件,需要判断进球时间是否在上半场(≤45分钟)。
def has_first_half_goal_by_events(events, first_half_end=45):
"""
通过进球事件列表判断上半场是否有进球
:param events: 进球事件列表,每个元素为 dict {"team":..., "minute":..., "player":...}
:param first_half_end: 上半场结束时间(含补时可用46+)
:return: bool
"""
for event in events:
if event["minute"] <= first_half_end:
return True
return False
# 示例:一场比赛的所有进球
match_events = [
{"team": "主队", "minute": 23, "player": "张三"},
{"team": "客队", "minute": 67, "player": "李四"},
{"team": "主队", "minute": 88, "player": "王五"},
]
if has_first_half_goal_by_events(match_events):
print("✅ 上半场有进球")
for e in match_events:
if e["minute"] <= 45:
print(f" ⚽ {e['minute']}' {e['player']} ({e['team']})")
else:
print("❌ 上半场无进球")
输出:
✅ 上半场有进球
⚽ 23' 张三 (主队)
进阶案例:批量分析(Pandas)
import pandas as pd
# 模拟多场比赛的进球数据
data = {
"match_id": [1, 1, 2, 3, 3, 3, 4],
"team": ["主", "客", "主", "主", "客", "客", "主"],
"minute": [23, 67, 12, 5, 30, 80, 55],
"player": ["A", "B", "C", "D", "E", "F", "G"],
}
df = pd.DataFrame(data)
# 标记是否为上半场进球(≤45分钟)
df["is_first_half"] = df["minute"] <= 45
# 按比赛分组统计
result = df.groupby("match_id")["is_first_half"].any().reset_index()
result.columns = ["match_id", "上半场有进球"]
print(result)
输出:
match_id 上半场有进球
0 1 True
1 2 True
2 3 True
3 4 False
考虑补时的情况
真实比赛中,上半场补时进球也算上半场,可以这样处理:
def judge_first_half(minute, half=1, stoppage=3):
"""
判断进球是否属于上半场
:param minute: 进球分钟
:param half: 判断哪半场
:param stoppage: 常规时间后的补时分钟数
"""
if half == 1:
return minute <= 45 + stoppage # 上半场含补时
else:
return minute > 45 # 下半场
# 测试
test_minutes = [40, 45, 46, 47, 48, 50]
print("上半场补时3分钟的情景:")
for m in test_minutes:
flag = "属于上半场" if judge_first_half(m, half=1) else "不属于上半场"
print(f" {m}' → {flag}")
输出:
上半场补时3分钟的情景:
40' → 属于上半场
45' → 属于上半场
46' → 属于上半场
47' → 属于上半场
48' → 属于上半场
50' → 不属于上半场
关键判断逻辑总结
| 判断方式 | 适用场景 | 核心逻辑 |
|---|---|---|
| 半场比分 | 数据源已有比分 | home + away > 0 |
| 进球事件 | 有详细事件数据 | minute <= 45 (+补时) |
| 批量分析 | 多场比赛统计 | groupby().any() |
核心原则:只要上半场任意一方进球数 > 0,则该场上半场有进球。
如果你有具体的数据格式(CSV、API 返回的 JSON),可以贴出来,我帮你写成对应的解析代码。