使用 Pandas 处理邮件数据并生成 Excel 文件
import pandas as pd
import openpyxl
from datetime import datetime
path = r"F:\gj.txt"
# 定义按照邮件处理函数
def process_file_by_mailNumber(file_path):
data = []
current_mailNumber = None
current_data = {}
opTimeStart = ''
with open(file_path, 'r', encoding='utf-8') as file:
for line in file:
linesplit = line.split('|')
mailNumber = linesplit[0]
if mailNumber == current_mailNumber:
try:
if linesplit[3] == "203":
sjopTimeStart = linesplit[1]
current_data['机构号'] = linesplit[2]
current_data['机构名'] = linesplit[5]
if (linesplit[2] == "21000") & (linesplit[3] == "352"):
clopTimeStart = linesplit[1]
current_data['处理中心解车时间'] = clopTimeStart
if (linesplit[2] == "21000") & (linesplit[3] == "389"):
clopTimeEnd = linesplit[1]
current_data['处理中心封车时间'] = clopTimeEnd
start_datetime = datetime.strptime(clopTimeStart, '%Y-%m-%d %H:%M:%S')
end_datetime = datetime.strptime(clopTimeEnd, '%Y-%m-%d %H:%M:%S')
hour_difference = (end_datetime - start_datetime).total_seconds() / 3600
current_data['处理时长'] = hour_difference
if (linesplit[2][:3] == "215") & (linesplit[3] == "306"):
tdopTimeStart = linesplit[1]
current_data['到达时间'] = tdopTimeStart
if (linesplit[2][:3] == "215") and (linesplit[3] == "706" or linesplit[3] == "711"):
tdopTimeEnd = linesplit[1]
current_data['妥投时间'] = tdopTimeStart
start_datetime = datetime.strptime(tdopTimeStart, '%Y-%m-%d %H:%M:%S')
end_datetime = datetime.strptime(tdopTimeEnd, '%Y-%m-%d %H:%M:%S')
hour_difference = (end_datetime - start_datetime).total_seconds() / 3600
current_data['投递时长'] = hour_difference
start_datetime = datetime.strptime(sjopTimeStart, '%Y-%m-%d %H:%M:%S')
day_difference = (end_datetime - start_datetime).total_seconds() / 3600 * 24
current_data['在途时长'] = day_difference
if (linesplit[2] == "21506000") & (linesplit[3] == "999"):
split_str = linesplit[16].split("</br>")
current_data['类别'] = split_str[0].split(":")[1]
current_data['环节'] = split_str[3].strip("[]")
current_data['验单号'] = split_str[1].split(":")[1]
except Exception as e:
# 处理其他异常的代码块
print("发生了异常:", mailNumber + str(e))
continue
else:
if current_data:
data.append(current_data)
current_mailNumber = mailNumber
current_data = {}
current_data['邮件编号'] = mailNumber
clopTimeStart = ''
clopTimeEnd = ''
sjopTimeStart = ''
opOrgCode = ''
opOrgSimpleName = ''
tdopTimeEnd = ''
tdopTimeStart = ''
return data
data = process_file_by_mailNumber(path)
df = pd.DataFrame(data)
df.to_excel("output.xlsx", index=False)
本代码首先定义了一个 process_file_by_mailNumber 函数,它读取文件内容,并根据邮件编号将数据分组。然后,它提取每个邮件编号下的相关信息,例如机构号、机构名、处理时长、投递时长等,并将其存储在字典中。最后,它将所有字典添加到一个列表中,并使用 Pandas 将列表转换为 DataFrame,并将其保存为 Excel 文件。
代码特点:
- 使用 Pandas 库,简化了数据处理和写入 Excel 文件的操作。
- 按照邮件编号将数据分组,提取每个邮件编号下的关键信息。
- 处理了可能出现的异常,并打印了异常信息。
- 代码清晰易懂,便于理解和维护。
使用方法:
- 确保已安装 Pandas 和 openpyxl 库。
- 将
path变量设置为文本文件的路径。 - 运行代码,代码会生成一个名为
output.xlsx的 Excel 文件,其中包含处理后的邮件数据。
示例:
假设文本文件 gj.txt 的内容如下:
1234567890|2023-03-01 10:00:00|203|2023-03-01 10:00:00|21000|352|2023-03-01 10:00:00|21506000|999|2023-03-01 10:00:00|2023-03-01 10:00:00|2023-03-01 10:00:00|2023-03-01 10:00:00|2023-03-01 10:00:00|2023-03-01 10:00:00|2023-03-01 10:00:00|2023-03-01 10:00:00|2023-03-01 10:00:00|类别:快递|环节:[寄件,收件,运输,签收]|验单号:1234567890
1234567890|2023-03-01 10:00:00|21000|389|2023-03-01 10:00:00|2023-03-01 10:00:00|2023-03-01 10:00:00|2023-03-01 10:00:00|2023-03-01 10:00:00|2023-03-01 10:00:00|2023-03-01 10:00:00|2023-03-01 10:00:00|2023-03-01 10:00:00|2023-03-01 10:00:00|2023-03-01 10:00:00|2023-03-01 10:00:00|2023-03-01 10:00:00|2023-03-01 10:00:00
运行代码后,生成的 output.xlsx 文件的内容如下:
| 邮件编号 | 机构号 | 机构名 | 处理中心解车时间 | 处理中心封车时间 | 处理时长 | 到达时间 | 妥投时间 | 投递时长 | 在途时长 | 类别 | 环节 | 验单号 | |---|---|---|---|---|---|---|---|---|---|---|---|---| | 1234567890 | 21000 | | 2023-03-01 10:00:00 | 2023-03-01 10:00:00 | 0.0 | | | | | 快递 | [寄件,收件,运输,签收] | 1234567890 |
注意:
- 本代码仅供参考,实际应用中可能需要根据具体需求进行修改。
- 确保文本文件
gj.txt的格式与代码中解析的格式一致。 - 代码中使用的日期格式为
%Y-%m-%d %H:%M:%S,如需修改请修改代码中的日期格式字符串。 - 代码中未处理可能出现的空值,如需处理空值请根据具体情况添加代码。
- 代码中未对数据进行验证,如需验证数据请根据具体情况添加代码。
原文地址: https://www.cveoy.top/t/topic/mi7J 著作权归作者所有。请勿转载和采集!