如何通过for循环从CSV文件获取所有日期数据?运行返回空DataFrame
问题原因
- 语法错误:筛选逻辑存在括号缺失,原代码
df.loc[(df['created_at'] == time[i]]中条件判断部分少了闭合右括号,代码本身就无法正常执行。 - 时区不匹配:
pd.date_range生成的时间序列带UTC时区标识(+00:00),属于时区感知时间;但你用pd.to_datetime转换created_at列时,仅解析年月日,输出的是不带时区的朴素时间,两者做等值判断永远无法命中,因此返回全空DataFrame。 - 逻辑低效:逐日期for循环匹配是pandas场景下的低性能写法,易出边界问题,非必要不使用。
可运行修复代码
方案1:兼容原有遍历逻辑
统一两边的日期格式,补全语法错误即可正常输出每日匹配数据:
import pandas as pd df = pd.read_csv('yogun_bakim_yatak.csv', encoding="utf-8") # 转换created_at为纯日期格式,去掉时分秒与时区信息 df['created_at'] = pd.to_datetime(df['created_at'], format='%Y-%m-%d').dt.date # 生成日期序列时去掉时区参数,和列格式完全对齐 time = pd.date_range(start="2020-12-25", end="2021-12-25", freq="D").date n = len(time) for i in range(n): # 补全缺失的右括号 filtered_df = df.loc[df['created_at'] == time[i]] # 可按需跳过无数据的日期 if not filtered_df.empty: print(f"===== {time[i]} 对应数据 =====") print(filtered_df.to_string())
方案2:高效无循环实现(推荐)
如果只是需要按日拆分数据,不需要逐行循环,用groupby直接按日期分组即可,性能远高于for循环:
import pandas as pd df = pd.read_csv('yogun_bakim_yatak.csv', encoding="utf-8") df['created_at'] = pd.to_datetime(df['created_at'], format='%Y-%m-%d').dt.date # 直接生成每日数据字典,key为日期,value为对应日期的DataFrame daily_data = {curr_date: sub_df for curr_date, sub_df in df.groupby('created_at')} # 取指定日期数据直接按键索引即可,示例为取2021年1月1日的数据 # target_df = daily_data.get(pd.to_datetime("2021-01-01").date())
注意:如果原始CSV的
created_at列带非0的时分秒信息,不要直接用等值匹配全天数据,要改用时间范围判断:df.loc[(df['created_at'] >= 当日零点) & (df['created_at'] < 次日零点)],避免漏掉时分秒不为0的记录。
内容的提问来源于stack exchange,提问作者Ceren
相关产品推荐
相关产品推荐

