fixed reg_data using reg_history

This commit is contained in:
Peter Howell 2025-08-16 14:48:22 -07:00
parent f15d103fb8
commit 1a0daf82b5
1 changed files with 31 additions and 19 deletions

View File

@ -1222,7 +1222,7 @@ def process_reg_history():
output1.write(f" [{dt}] {msg}\n")
def recreate_reg_data():
import csv
from collections import defaultdict
from datetime import datetime
@ -1230,43 +1230,55 @@ def recreate_reg_data():
dt = datetime.strptime(row['datetime'], "%Y-%m-%dT%H-%M")
crn = row['crn']
enrolled = int(row['enrolled'])
return dt, crn, enrolled
return dt, row['datetime'], crn, enrolled
def reduce_latest_per_day(rows):
latest = defaultdict(dict) # latest[crn][date_str] = (dt, enrolled)
latest = defaultdict(dict) # latest[crn][date] = (dt, ts, enrolled)
latest_ts_by_date = {} # date → (dt, ts) for header naming
for row in rows:
dt, crn, enrolled = parse_row(row)
day = dt.date().isoformat()
if day not in latest[crn] or dt > latest[crn][day][0]:
latest[crn][day] = (dt, enrolled)
return latest
dt, full_ts, crn, enrolled = parse_row(row)
date_str = dt.date().isoformat()
ts_header = dt.strftime("%Y-%m-%dT%H") # <-- this is what we want
def pivot_to_table(latest_data):
all_dates = sorted({day for crn in latest_data for day in latest_data[crn]})
crns = sorted(latest_data)
# for each crn, per day, keep latest reading
if date_str not in latest[crn] or dt > latest[crn][date_str][0]:
latest[crn][date_str] = (dt, ts_header, enrolled)
# also record latest timestamp per day for consistent column headers
if date_str not in latest_ts_by_date or dt > latest_ts_by_date[date_str][0]:
latest_ts_by_date[date_str] = (dt, ts_header)
return latest, [ts for _, ts in sorted(latest_ts_by_date.values())]
def pivot_table(latest, headers):
crns = sorted(latest)
table = []
for crn in crns:
row = [crn]
for day in all_dates:
val = latest_data[crn].get(day, (None, None))[1]
row.append(str(val) if val is not None else "")
for ts in headers:
date_str = ts[:10] # match on YYYY-MM-DD
val = latest[crn].get(date_str)
if val and val[1] == ts:
row.append(str(val[2]))
else:
row.append("")
table.append(row)
return ["crn"] + all_dates, table
return ['crn'] + headers, table
with open("cache/reg_history_fa25.csv", newline='') as f:
fieldnames = ['datetime', 'crn', 'course', 'teacher', 'max', 'enrolled', 'waitlistmax', 'waitlisted']
reader = csv.DictReader(f, fieldnames=fieldnames)
rows = list(reader)
latest = reduce_latest_per_day(rows)
header, table = pivot_to_table(latest)
latest, headers = reduce_latest_per_day(rows)
header_row, table = pivot_table(latest, headers)
with open("cache/reg_data_fa25.csv", "w", newline='') as f:
writer = csv.writer(f)
writer.writerow(header)
writer.writerow(header_row)
writer.writerows(table)