好友
阅读权限20
听众
最后登录1970-1-1
|
import pandas as pd
def try_parse_date(date_str, date_formats):
for date_format in date_formats:
try:
return pd.to_datetime(date_str, format=date_format)
except ValueError:
continue
return None
# 定义文件路径
#input_file_path = r'D:\(ctx+PY\w200gb2312.csv' # 请替换为实际的文件路径
input_file_path = r'D:\(ctx+PY\w200.csv' # 请替换为实际的文件路径
output_file_path = r'D:\(ctx+PY\new2023_w200.csv' # 请替换为实际的文件路径
# 设置分批读取的大小,根据你的内存大小调整
chunk_size = 5000
# 初始化已处理的行数
total_rows_processed = 0
# 可能的日期格式列表
date_formats = ['%Y-%m-%d', '%Y/%m/%d', '%Y.%m.%d', '%Y %m %d']
# 初始化分批读取的迭代器,使用UTF-8编码尝试读取
chunks = pd.read_csv(input_file_path, chunksize=chunk_size, encoding='UTF-8-SIG', low_memory=False)
#chunks = pd.read_csv(input_file_path, chunksize=chunk_size, encoding='Gb2312', low_memory=False)
#注意这里Gb2312编码测试你的csv表格部分数据是正确的,但是你提供的上市公司-专利明细数据.csv文件编码是UTF-8-SIG就有问题很奇怪!
# 初始化用于存储结果的DataFrame
df_result = pd.DataFrame()
# 逐块处理数据
for chunk_index, chunk in enumerate(chunks, start=1):
# 尝试自动检测日期列
date_col = None
for col in chunk.columns:
if pd.api.types.is_string_dtype(chunk[col]):
chunk[col] = chunk[col].str.strip() # 移除空白字符
# 尝试解析每一列作为日期
parsed_dates = chunk[col].apply(lambda x: try_parse_date(x, date_formats))
if not parsed_dates.isnull().all():
date_col = col
break
# 如果找到日期列,则筛选2023年的数据
if date_col is not None:
chunk_2023 = chunk[parsed_dates.dt.year == 2023]
df_result = pd.concat([df_result, chunk_2023], ignore_index=True)
else:
print(f"在块 {chunk_index} 中未找到可解析的日期列。")
# 更新已处理的行数并打印进度
total_rows_processed += len(chunk)
print(f"已处理到第 {total_rows_processed} 行...")
# 将结果写入新的CSV文件,使用UTF-8编码
if not df_result.empty:
df_result.to_csv(output_file_path, index=False, encoding='UTF-8')
print(f"处理完成,结果已保存至 {output_file_path}")
else:
print("没有数据被写入输出文件。")
print(f"总共处理了 {total_rows_processed} 行数据。") |
|