首次提交

This commit is contained in:
2026-09-28 16:09:31 +08:00
commit 4a6839319a
71 changed files with 12144 additions and 0 deletions

99
tools/daily_stats.py Normal file
View File

@@ -0,0 +1,99 @@
# -*- coding: utf-8 -*-
"""
按天统计 数据.jsonl:每天处理了多少条视频、处理的视频总时长是多少。
日期取 process_start(没有则回退 timestamp)的年月日。
用法(在项目根目录运行):
python temp/daily_stats.py [数据.jsonl路径]
默认: python temp/daily_stats.py 数据.jsonl
"""
import json
import sys
from collections import defaultdict
JSONL_PATH = sys.argv[1] if len(sys.argv) > 1 else "数据.jsonl"
def main():
try:
f = open(JSONL_PATH, encoding="utf-8")
except FileNotFoundError:
print(f"找不到文件: {JSONL_PATH}")
return
# 每天: count/success/no_subtitle/error 计数;dur=全部视频时长;dur_ok=成功视频时长
days = defaultdict(lambda: {"count": 0, "success": 0, "no_subtitle": 0,
"error": 0, "dur": 0.0, "dur_ok": 0.0})
no_date = 0
with f:
for line in f:
line = line.strip()
if not line:
continue
try:
rec = json.loads(line)
except json.JSONDecodeError:
continue
ts = rec.get("process_start") or rec.get("timestamp") or ""
day = ts[:10] if len(ts) >= 10 else None # YYYY-MM-DD
if not day:
no_date += 1
continue
d = days[day]
d["count"] += 1
status = rec.get("status")
if status == "success":
d["success"] += 1
elif status == "no_subtitle":
d["no_subtitle"] += 1
else:
d["error"] += 1
dur = rec.get("duration") or 0
try:
dur = float(dur)
d["dur"] += dur
if status == "success":
d["dur_ok"] += dur # 只累计成功出字幕的视频时长
except (TypeError, ValueError):
pass
if not days:
print("没有可统计的数据")
return
print(f"文件: {JSONL_PATH}")
print("=" * 84)
print(f"{'日期':<12}{'视频数':>7}{'成功':>7}{'无字幕':>7}{'错误':>7}"
f"{'总时长(h)':>12}{'成功时长(h)':>14}")
print("-" * 84)
tot = {"count": 0, "success": 0, "no_subtitle": 0, "error": 0, "dur": 0.0, "dur_ok": 0.0}
for day in sorted(days):
d = days[day]
print(f"{day:<12}{d['count']:>7}{d['success']:>7}{d['no_subtitle']:>7}"
f"{d['error']:>7}{d['dur']/3600:>12.1f}{d['dur_ok']/3600:>14.1f}")
for k in tot:
tot[k] += d[k]
print("-" * 84)
print(f"{'合计':<12}{tot['count']:>7}{tot['success']:>7}{tot['no_subtitle']:>7}"
f"{tot['error']:>7}{tot['dur']/3600:>12.1f}{tot['dur_ok']/3600:>14.1f}")
if no_date:
print(f"\n({no_date} 条无日期字段,已跳过)")
n_days = len(days)
if n_days:
print(f"\n共 {n_days} 天 | 日均处理 {tot['count']/n_days:.0f} 条 / "
f"{tot['dur']/3600/n_days:.1f} h | 日均成功 {tot['success']/n_days:.0f} 条 / "
f"{tot['dur_ok']/3600/n_days:.1f} h")
print(f"成功率 {tot['success']/tot['count']*100:.1f}% | "
f"成功时长占比 {tot['dur_ok']/tot['dur']*100:.1f}%" if tot['dur'] else "")
if __name__ == "__main__":
main()