档案整理统计工作规定落地:Python自动化处理全流程实操
一、环境准备与依赖安装
为了实现档案整理与统计的自动化,我们需要构建一个基于Python的本地处理环境。本方案不依赖复杂的IDE,直接使用命令行操作即可完成。请确保你的操作系统已安装Python 3.8及以上版本。
我们需要安装处理Excel数据和日期的核心库。打开终端(Windows下为CMD或PowerShell,Mac下为Terminal),依次执行以下命令进行安装:
安装命令:
pip install pandas openpyxl xlrd python-dateutil
安装完成后,我们需要创建项目目录结构。请在你的工作盘(如D盘)下创建如下文件夹结构,以便规范管理输入输出文件:
D:/archive_project/
├── data/ 存放待处理的原始档案Excel文件
├── output/ 存放处理后的统计报表和清洗后的数据
└── archive_tool.py 我们的自动化脚本
二、数据源标准与模拟数据
在编写代码前,必须明确“档案整理统计工作规定”中的核心数据字段。通常规定要求包含:档案编号、档案名称、归档日期、保管期限、责任部门、密级。为了确保你能够直接测试,请在data文件夹下创建一个名为raw_data.xlsx的文件,并填入以下模拟数据(包含故意设置的脏数据以测试清洗逻辑):
| 档案编号 | 档案名称 | 归档日期 | 保管期限 | 责任部门 | 密级 |
|---|---|---|---|---|---|
| AR-2023-001 | 年度财务审计报告 | 2023/12/01 | 永久 | 财务部 | 机密 |
| AR-2023-002 | 人力资源招聘计划 | 2023.12.05 | 10年 | 人资部 | 内部 |
| AR-2023-003 | (空格)项目验收单 | 2023-12-10 | 30年 | 技术部 | 公开 |
| AR-2023-004 | 合同扫描件 | 2023/15/01 | 长期 | 法务部 | 机密 |
注意:上述数据中包含了日期格式不统一(斜杠、点、横杠)、名称含空格、日期非法(15月)、保管期限非标准(长期需转换)等问题,这些都是实际工作中常见的“卡壳”点。
三、核心代码实现:数据清洗与合规校验
创建archive_tool.py文件,我们将分步骤编写代码。首先引入必要的库并定义数据清洗函数。这一步的目标是将混乱的原始数据转化为符合“档案整理统计工作规定”的标准数据。
1. 导入库与定义标准化映射
import pandas as pd
import os
from datetime import datetime
定义标准保管期限映射,解决“长期”等非标准术语
TERM_MAPPING = {
"永久": "永久",
"长期": "30年", 根据规定,长期通常对应30年
"短期": "10年"
}
定义规定的标准密级列表
VALID_SECRECY_LEVELS = ["公开", "内部", "机密", "绝密"]
2. 实现日期标准化函数

档案统计对日期要求极高,我们需要编写一个强力的日期解析器,处理2023/12/01、2023.12.05等格式,并捕获非法日期。
def parse_date(date_str):
if pd.isna(date_str):
return None
尝试自动解析各种格式
for fmt in ('%Y-%m-%d', '%Y/%m/%d', '%Y.%m.%d', '%Y%m%d'):
try:
return datetime.strptime(str(date_str).strip(), fmt).strftime('%Y-%m-%d')
except ValueError:
continue
如果都失败,尝试pandas的智能解析作为最后手段
try:
return pd.to_datetime(date_str, errors='raise').strftime('%Y-%m-%d')
except:
return "非法日期"
3. 实现数据清洗主逻辑
此步骤将加载Excel,执行去空格、日期转换、期限映射,并标记不符合规定的数据行。
def clean_and_validate_data(file_path):
读取Excel
df = pd.read_excel(file_path)
1. 清洗档案名称:去除首尾空格
df['档案名称'] = df['档案名称'].astype(str).str.strip()
2. 清洗归档日期:应用自定义解析函数
df['归档日期'] = df['归档日期'].apply(parse_date)
3. 标准化保管期限:映射非标准词汇
df['保管期限'] = df['保管期限'].map(lambda x: TERM_MAPPING.get(x, x) if x in TERM_MAPPING else x)
4. 合规性校验:标记错误行
规定:档案编号不能为空,日期不能非法,密级必须在规定列表内
df['校验状态'] = '通过'
df['错误详情'] = ''
检查日期非法
invalid_dates = df['归档日期'] == '非法日期'
df.loc[invalid_dates, '校验状态'] = '不通过'
df.loc[invalid_dates, '错误详情'] += '日期格式错误; '
检查密级合规
invalid_secrecy = ~df['密级'].isin(VALID_SECRECY_LEVELS)
df.loc[invalid_secrecy, '校校验状态'] = '不通过'
df.loc[invalid_secrecy, '错误详情'] += '密级不符合规定; '
return df
四、核心代码实现:自动化统计与报表生成
数据清洗完成后,根据“档案整理统计工作规定”,我们需要生成两份关键报表:一是各部门的档案数量统计,二是保管期限的分布情况。我们将使用Pandas的groupby和pivot_table功能实现。
1. 生成统计报表
def generate_statistics(df):
过滤掉校验不通过的数据,仅统计合规档案
valid_df = df[df['校验状态'] == '通过'].copy()
统计1:各部门档案数量统计(按责任部门分组)
dept_stats = valid_df.groupby('责任部门').size().reset_index(name='档案数量')
dept_stats['统计时间'] = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
统计2:保管期限分布(透视表)
行:责任部门,列:保管期限,值:数量
term_stats = valid_df.pivot_table(
index='责任部门',
columns='保管期限',
values='档案编号',
aggfunc='count',
fill_value=0
).reset_index()
return dept_stats, term_stats
2. 文件导出与格式优化
为了方便查阅,导出Excel时需要设置索引列,并对关键列进行排序。
def save_reports(df_clean, dept_stats, term_stats, output_dir):
if not os.path.exists(output_dir):
os.makedirs(output_dir)
导出清洗后的全量数据
clean_path = os.path.join(output_dir, '01_清洗后档案数据.xlsx')
df_clean.to_excel(clean_path, index=False)
导出部门统计表
dept_path = os.path.join(output_dir, '02_部门档案统计表.xlsx')
dept_stats.to_excel(dept_path, index=False)
导出保管期限透视表
term_path = os.path.join(output_dir, '03_保管期限分布表.xlsx')
term_stats.to_excel(term_path, index=False)
print(f"处理完成。报告已生成至:{output_dir}")
五、完整脚本整合与运行
将上述所有函数整合,并添加主执行入口main。请将以下完整代码覆盖archive_tool.py中的内容。
import pandas as pd
import os
from datetime import datetime
配置区域
INPUT_FILE = 'data/raw_data.xlsx'
OUTPUT_DIR = 'output'
常量定义
TERM_MAPPING = {
"永久": "永久",
"长期": "30年",
"短期": "10年"
}
VALID_SECRECY_LEVELS = ["公开", "内部", "机密", "绝密"]
函数定义
def parse_date(date_str):
if pd.isna(date_str):
return None
for fmt in ('%Y-%m-%d', '%Y/%m/%d', '%Y.%m.%d', '%Y%m%d'):
try:
return datetime.strptime(str(date_str).strip(), fmt).strftime('%Y-%m-%d')
except ValueError:
continue
try:
return pd.to_datetime(date_str, errors='raise').strftime('%Y-%m-%d')
except:
return "非法日期"
def clean_and_validate_data(file_path):
try:
df = pd.read_excel(file_path)
except FileNotFoundError:
print(f"错误:找不到文件 {file_path}")
return None
df['档案名称'] = df['档案名称'].astype(str).str.strip()
df['归档日期'] = df['归档日期'].apply(parse_date)
df['保管期限'] = df['保管期限'].map(lambda x: TERM_MAPPING.get(x, x) if x in TERM_MAPPING else x)
df['校验状态'] = '通过'
df['错误详情'] = ''
invalid_dates = df['归档日期'] == '非法日期'
df.loc[invalid_dates, '校验状态'] = '不通过'
df.loc[invalid_dates, '错误详情'] += '日期格式错误; '
invalid_secrecy = ~df['密级'].isin(VALID_SECRECY_LEVELS)
df.loc[invalid_secrecy, '校验状态'] = '不通过'
df.loc[invalid_secrecy, '错误详情'] += '密级不符合规定; '
return df
def generate_statistics(df):
valid_df = df[df['校验状态'] == '通过'].copy()
dept_stats = valid_df.groupby('责任部门').size().reset_index(name='档案数量')
dept_stats['统计时间'] = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
term_stats = valid_df.pivot_table(
index='责任部门',
columns='保管期限',
values='档案编号',
aggfunc='count',
fill_value=0
).reset_index()
return dept_stats, term_stats
def save_reports(df_clean, dept_stats, term_stats, output_dir):
if not os.path.exists(output_dir):
os.makedirs(output_dir)
df_clean.to_excel(os.path.join(output_dir, '01_清洗后档案数据.xlsx'), index=False)
dept_stats.to_excel(os.path.join(output_dir, '02_部门档案统计表.xlsx'), index=False)
term_stats.to_excel(os.path.join(output_dir, '03_保管期限分布表.xlsx'), index=False)
print(f"处理完成。报告已生成至:{os.path.abspath(output_dir)}")
def main():
print("开始执行档案整理与统计任务...")
df_clean = clean_and_validate_data(INPUT_FILE)
if df_clean is not None:
dept_stats, term_stats = generate_statistics(df_clean)
save_reports(df_clean, dept_stats, term_stats, OUTPUT_DIR)
打印简单的控制台预览
print("\n 部门档案统计预览 ")
print(dept_stats.to_string(index=False))
if __name__ == "__main__":
main()
运行步骤
1. 确保你的raw_data.xlsx已经放在data目录下。
2. 在archive_project目录下打开命令行。
3. 输入以下命令运行脚本:
python archive_tool.py
结果验证
运行成功后,请打开output文件夹。你将看到三个Excel文件:
- 01_清洗后档案数据.xlsx:检查“归档日期”列是否统一为YYYY-MM-DD格式,检查“校验状态”列,
AR-2023-004应被标记为“不通过”,因为其日期非法。 - 02_部门档案统计表.xlsx:查看财务部、人资部、技术部的数量是否正确(注意:非法数据行通常会被剔除在统计之外,具体取决于业务逻辑,本脚本中剔除了校验未通过的数据)。
- 03_保管期限分布表.xlsx:查看是否正确将“长期”转换并归类到了“30年”列下。
通过以上实操,你已经完成了一套符合档案管理规定的自动化整理统计系统。该脚本可直接应用于实际的月度档案归档工作中,只需替换data目录下的Excel文件即可。