如何在Jupyter Notebook中用Python删除CSV指定日期前的数据?
处理百万行CSV:删除2010年1月1日0点前的数据
先说说你代码的问题
你写的df [(df['Date Time'].dt.year < 2010-0o1)]有两个明显错误:
0o1是Python的八进制表示,对应十进制的1,所以2010-0o1实际是2009,逻辑上只筛选了年份小于2009的行,完全没覆盖「2010年1月1日0点前」的完整条件(比如2009年12月31日的行也应该被删除)。- 只判断年份太粗糙,必须用完整的日期时间做比较,否则会漏掉2010年1月1日0点前的临界数据。
另外,如果你没先把Date Time列转换成datetime类型就用.dt.year,也会触发报错——这大概率是你看到超长报错的原因。
正确处理步骤(分两种场景)
场景1:内存足够直接加载文件
如果你的电脑内存能装下百万行数据,直接用以下代码:
import pandas as pd # 读取CSV文件 df = pd.read_csv('你的文件名.csv') # 把'Date Time'列转为datetime类型,务必根据你文件的日期格式调整format参数 # 比如你的日期是'2009-12-31 23:59'就用'%Y-%m-%d %H:%M',是'12/31/2009 11:59 PM'就用'%m/%d/%Y %I:%M %p' df['Date Time'] = pd.to_datetime(df['Date Time'], format='%Y-%m-%d %H:%M:%S') # 定义要保留的起始时间 cutoff_time = pd.to_datetime('2010-01-01 00:00:00') # 筛选保留时间在cutoff之后的行 df_filtered = df[df['Date Time'] >= cutoff_time] # 保存处理后的文件 df_filtered.to_csv('过滤后的文件名.csv', index=False)
场景2:内存不够,分块处理大文件
百万行CSV如果内存吃不消,用分块读取的方式,避免一次性加载整个文件:
import pandas as pd cutoff_time = pd.to_datetime('2010-01-01 00:00:00') chunk_size = 100000 # 每次处理10万行,可根据你的内存情况调整大小 # 打开输出文件,分块写入 with open('过滤后的文件名.csv', 'w') as output_file: first_write = True for chunk in pd.read_csv('你的文件名.csv', chunksize=chunk_size): # 转换当前块的日期列 chunk['Date Time'] = pd.to_datetime(chunk['Date Time'], format='%Y-%m-%d %H:%M:%S') # 筛选符合条件的行 filtered_chunk = chunk[chunk['Date Time'] >= cutoff_time] # 第一块写入表头,后续块不写 filtered_chunk.to_csv(output_file, index=False, header=first_write) first_write = False
关键注意事项
- 一定要匹配
format参数:如果你的日期格式和示例不一样,必须调整pd.to_datetime里的format,否则会出现日期转换失败的报错。 - 筛选逻辑是「保留>=2010-01-01 00:00:00」的数据,也就是自动删除了这个时间点之前的所有行,符合你的需求。
内容的提问来源于stack exchange,提问作者demi_k
相关产品推荐
相关产品推荐

