把频道 400 条视频元数据导进表格,我遇到了日期字段和空值的坑
我做的是把频道后台导出的视频列表(约 400 条,CSV,带播放量、时长、发布时间)和自己的发布记录对账,想看看哪几条表现异常。环境是 macOS 本地,Python 3.11 + pandas 2.1,数据量不大,但字段很脏。
做法分三步。先用 csv 模块预扫一遍,找出每列的实际类型,而不是直接 pd.read_csv:
import csv
from collections import Counter
with open('videos.csv', newline='', encoding='utf-8-sig') as f:
rows = list(csv.DictReader(f))
for col in rows[0]:
kinds = Counter(type(r[col]).__name__ for r in rows)
print(col, kinds, '空值:', sum(1 for r in rows if r[col] in ('', '-', 'N/A')))
结果发现「发布时间」有两种格式混着:一部分是 2023-11-02,一部分是 2023/11/02;「时长」里还有 12:03 和 1:02:33 混排;播放量列有十几行是空字符串。
第二步按字段分别处理,不搞统一转换:
import pandas as pd
df = pd.read_csv('videos.csv', encoding='utf-8-sig', dtype=str)
df['发布时间'] = pd.to_datetime(df['发布时间'].str.replace('/', '-'), errors='coerce')
df['播放量'] = pd.to_numeric(df['播放量'], errors='coerce')
df['时长秒'] = df['时长'].map(
lambda s: sum(int(x) * 60 ** i for i, x in enumerate(reversed(str(s).split(':'))))
if isinstance(s, str) and s.strip() else None
)
print(df[df['发布时间'].isna() | df['播放量'].isna()])
第三步是把对不上的行单独导出成一份 csv,人工看,而不是在脚本里猜。
为什么这么做:errors='coerce' 会把坏值变成 NaT/NaN,看起来省事,但代价是它静默吞掉错误,所以我在转换后一定把空值行打出来。日期用 / 换 - 是因为 pandas 对混合分隔符的推断不稳定,不同批次导出会给出不同 dtype。时长按 split 再乘 60 的幂,是因为 pd.to_timedelta 对 12:03 这种不带小时的字符串会报错。
失效的地方也说一下:播放量是空字符串的行,未必真的没有播放,可能是后台导出时该视频还在处理;errors='coerce' 对 1,203 这种带千分位的字符串也会返回 NaN,得先 replace 逗号。我自己踩的坑是有 3 行发布时间是 2023-11-02 00:00:00+00:00,带了时区,和纯日期比较时全对不上,后来统一 dt.tz_localize(None) 才平。
问题留给你们:你们导出的视频列表里,「发布时间」是本地时间还是 UTC,有没有和后台页面显示对不上的情况?
0
赞同度 100% · 0 条评论 · 5 阅读
0 条评论
还没有评论,写下第一条。