如何用Python读取CSV文件并对比昨日与今日的数据?
问题描述
现有CSV文件内容如下:
date,students 2022-11-16,22 2022-11-17,29
需求是读取该CSV,提取昨日和今日对应的学生数,校验两者是否存在5%的差异阈值,但在提取对应行的学生数时遇到困难。
尝试的代码如下:
import pandas as pd from datetime import date from datetime import timedelta today = date.today() yesterday = date.today() - timedelta(1) print("today is ", today, " and yesterday was ", yesterday) df = pd.read_csv('test.csv') col1 = df.timestamp col2 = df.hostcount for row in col1: if row == str(yesterday): print(row)
解决思路与修正代码
你的代码核心问题有两个:
- CSV的列名是
date和students,但代码错误使用了timestamp和hostcount,这是找不到数据的直接原因 - 没必要用循环遍历,Pandas支持直接通过条件筛选定位目标行,效率更高
修正后的完整代码:
import pandas as pd from datetime import date, timedelta today = date.today() yesterday = today - timedelta(1) # 读取CSV并转换日期列,避免字符串匹配的格式问题 df = pd.read_csv('test.csv') df['date'] = pd.to_datetime(df['date']).dt.date # 获取昨日和今日的学生数 yesterday_students = df[df['date'] == yesterday]['students'].values[0] today_students = df[df['date'] == today]['students'].values[0] # 计算差异率(以昨日数据为基准) diff_rate = abs(today_students - yesterday_students) / yesterday_students * 100 print(f"昨日学生数: {yesterday_students}, 今日学生数: {today_students}") print(f"差异率: {diff_rate:.2f}%") # 校验5%阈值 if diff_rate > 5: print("差异超过5%阈值!") else: print("差异在5%阈值范围内。")
额外优化建议
如果CSV中存在某一天数据缺失的情况,直接用values[0]会报错,可以添加判断逻辑:
# 检查昨日数据是否存在 if not df[df['date'] == yesterday].empty: yesterday_students = df[df['date'] == yesterday]['students'].values[0] else: print("昨日数据缺失!") # 检查今日数据是否存在 if not df[df['date'] == today].empty: today_students = df[df['date'] == today]['students'].values[0] else: print("今日数据缺失!")
内容的提问来源于stack exchange,提问作者n3tl0kr
相关产品推荐
相关产品推荐

