nba / scripts /nba_schedule.py
yetarnished's picture
Update scripts/nba_schedule.py
a5f1d3c verified
Raw
History Blame Contribute Delete
3.36 kB
from nba_api.stats.endpoints import scoreboardv2
from nba_api.stats.static import teams
from datetime import datetime
import pytz
# --- Configuration ---
# Set your target timezone
target_timezone = pytz.timezone('US/Arizona')
eastern_timezone = pytz.timezone('US/Eastern')
# --- Helper: Get Today's Date in AZ ---
now_az = datetime.now(target_timezone)
game_date_str = now_az.strftime('%Y-%m-%d')
print(f"Fetching games for {now_az.strftime('%A, %b %d')} (Arizona Time)...")
print("-" * 30)
try:
# 1. Fetch Data
board = scoreboardv2.ScoreboardV2(game_date=game_date_str)
games_df = board.game_header.get_data_frame()
linescore_df = board.line_score.get_data_frame()
if games_df.empty:
print("No games scheduled today.")
else:
# 2. Map Team IDs to Names
nba_teams = teams.get_teams()
team_map = {t['id']: t['full_name'] for t in nba_teams}
# 3. Iterate Games
for _, game in games_df.iterrows():
game_id = game['GAME_ID']
host_name = team_map.get(game['HOME_TEAM_ID'], "Unknown")
visitor_name = team_map.get(game['VISITOR_TEAM_ID'], "Unknown")
status_text = game['GAME_STATUS_TEXT'] # e.g. "7:00 pm ET", "Final"
# Get Scores if available
home_score = 0
visitor_score = 0
# Filter linescore for this game
game_scores = linescore_df[linescore_df['GAME_ID'] == game_id]
if not game_scores.empty:
# Home Score
h_rows = game_scores[game_scores['TEAM_ID'] == game['HOME_TEAM_ID']]
if not h_rows.empty and h_rows['PTS'].values[0]:
home_score = int(h_rows['PTS'].values[0])
# Visitor Score
v_rows = game_scores[game_scores['TEAM_ID'] == game['VISITOR_TEAM_ID']]
if not v_rows.empty and v_rows['PTS'].values[0]:
visitor_score = int(v_rows['PTS'].values[0])
# Time Conversion
display_time = ""
if "ET" in status_text:
try:
time_part = status_text.replace(" ET", "").strip()
dt_str = f"{game_date_str} {time_part}"
dt_est = datetime.strptime(dt_str, '%Y-%m-%d %I:%M %p')
dt_est = eastern_timezone.localize(dt_est)
dt_az = dt_est.astimezone(target_timezone)
display_time = dt_az.strftime('%I:%M %p MST')
except:
display_time = status_text
else:
display_time = status_text
# --- OUTPUT FOR UI PARSER ---
# The JS regex looks for "Visitor @ Home"
print(f"\n{visitor_name} @ {host_name}")
# The JS regex looks for scores "100 - 90"
# Only print scores if game has started
if "Final" in status_text or "Q" in status_text or ":" in str(status_text) and "ET" not in str(status_text):
print(f"{visitor_score} - {home_score}")
print(f"Status: {status_text}") # "Final" or "Live" triggers
else:
print(f"Time: {display_time}")
print("Status: Upcoming")
except Exception as e:
print(f"Error: {e}")