分析并可视化机场离场车辆数数据
本文将详细介绍如何使用Python的正则表达式库re
和绘图库matplotlib
对机场离场车辆数数据进行分析和可视化。以下是具体步骤和代码实现。
数据资源:
链接:https://pan.baidu.com/s/1rU-PRhrVSXq-8YdR6obc6Q?pwd=1234
提取码:1234
1. 导入必要的库
首先,我们需要导入用于数据处理和绘图的库:
import re
import matplotlib.pyplot as plt
from datetime import datetime
import matplotlib.font_manager as fm
2. 读取文件内容
假设我们有两个文件,分别是郑州机场9月14上午原始数据.txt
和郑州机场9月14下午原始数据.txt
,其中包含了机场的离场车辆数数据。我们需要读取这两个文件的内容并合并:
# 文件路径
file_paths = ['郑州机场9月14上午原始数据.txt', '郑州机场9月14下午原始数据.txt']
# 初始化数据列表
data = ''
# 读取文件内容
for file_path in file_paths:
with open(file_path, 'r', encoding='utf-8') as file:
data += file.read() # 读取文件中的所有内容并合并
# 若没有文件,先用一下数据代替
# 示例数据
# data = """
# 郑州机场出租车秩序管理站 截止目前为止(2019-09-14 07:40:19) 场内待运车辆数为:80 辆; 前半小时进场车辆数为:18 辆; 前半小时离场车辆数为:0 辆;
# 郑州机场出租车秩序管理站 截止目前为止(2019-09-14 07:40:30) 场内待运车辆数为:80 辆; 前半小时进场车辆数为:18 辆; 前半小时离场车辆数为:0 辆;
# 郑州机场出租车秩序管理站 截止目前为止(2019-09-14 07:40:41) 场内待运车辆数为:80 辆; 前半小时进场车辆数为:18 辆; 前半小时离场车辆数为:0 辆;
# 郑州机场出租车秩序管理站 截止目前为止(2019-09-14 07:40:52) 场内待运车辆数为:80 辆; 前半小时进场车辆数为:18 辆; 前半小时离场车辆数为:0 辆;
# 郑州机场出租车秩序管理站 截止目前为止(2019-09-14 07:41:04) 场内待运车辆数为:81 辆(场内待运较多); 前半小时进场车辆数为:19 辆; 前半小时离场车辆数为:0 辆;
# 郑州机场出租车秩序管理站 截止目前为止(2019-09-14 07:41:15) 场内待运车辆数为:81 辆(场内待运较多); 前半小时进场车辆数为:19 辆; 前半小时离场车辆数为:0 辆;
# 郑州机场出租车秩序管理站 截止目前为止(2019-09-14 07:41:26) 场内待运车辆数为:81 辆(场内待运较多); 前半小时进场车辆数为:19 辆; 前半小时离场车辆数为:0 辆;
# 郑州机场出租车秩序管理站 截止目前为止(2019-09-14 07:41:39) 场内待运车辆数为:81 辆(场内待运较多); 前半小时进场车辆数为:19 辆; 前半小时离场车辆数为:0 辆;
# 郑州机场出租车秩序管理站 截止目前为止(2019-09-14 07:41:50) 场内待运车辆数为:81 辆(场内待运较多); 前半小时进场车辆数为:19 辆; 前半小时离场车辆数为:0 辆;
# 郑州机场出租车秩序管理站 截止目前为止(2019-09-14 07:42:01) 场内待运车辆数为:81 辆(场内待运较多); 前半小时进场车辆数为:19 辆; 前半小时离场车辆数为:0 辆;
# 郑州机场出租车秩序管理站 截止目前为止(2019-09-14 07:42:12) 场内待运车辆数为:81 辆(场内待运较多); 前半小时进场车辆数为:19 辆; 前半小时离场车辆数为:0 辆;
# 郑州机场出租车秩序管理站 截止目前为止(2019-09-14 07:42:22) 场内待运车辆数为:81 辆(场内待运较多); 前半小时进场车辆数为:19 辆; 前半小时离场车辆数为:0 辆;
# 郑州机场出租车秩序管理站 截止目前为止(2019-09-14 07:42:34) 场内待运车辆数为:80 辆; 前半小时进场车辆数为:19 辆; 前半小时离场车辆数为:1 辆;
# 郑州机场出租车秩序管理站 截止目前为止(2019-09-14 07:42:45) 场内待运车辆数为:80 辆; 前半小时进场车辆数为:19 辆; 前半小时离场车辆数为:1 辆;
# 郑州机场出租车秩序管理站 截止目前为止(2019-09-14 07:42:57) 场内待运车辆数为:80 辆; 前半小时进场车辆数为:19 辆; 前半小时离场车辆数为:1 辆;
# 郑州机场出租车秩序管理站 截止目前为止(2019-09-14 07:43:08) 场内待运车辆数为:81 辆(场内待运较多); 前半小时进场车辆数为:19 辆; 前半小时离场车辆数为:1 辆;
# 郑州机场出租车秩序管理站 截止目前为止(2019-09-14 07:43:19) 场内待运车辆数为:81 辆(场内待运较多); 前半小时进场车辆数为:19 辆; 前半小时离场车辆数为:1 辆;
# 郑州机场出租车秩序管理站 截止目前为止(2019-09-14 07:43:30) 场内待运车辆数为:81 辆(场内待运较多); 前半小时进场车辆数为:18 辆; 前半小时离场车辆数为:1 辆;
# 郑州机场出租车秩序管理站 截止目前为止(2019-09-14 07:43:41) 场内待运车辆数为:81 辆(场内待运较多); 前半小时进场车辆数为:18 辆; 前半小时离场车辆数为:1 辆;
# 郑州机场出租车秩序管理站 截止目前为止(2019-09-14 07:43:53) 场内待运车辆数为:81 辆(场内待运较多); 前半小时进场车辆数为:18 辆; 前半小时离场车辆数为:1 辆;
# 郑州机场出租车秩序管理站 截止目前为止(2019-09-14 07:44:05) 场内待运车辆数为:81 辆(场内待运较多); 前半小时进场车辆数为:18 辆; 前半小时离场车辆数为:1 辆;
# 郑州机场出租车秩序管理站 截止目前为止(2019-09-14 07:44:16) 场内待运车辆数为:81 辆(场内待运较多); 前半小时进场车辆数为:18 辆; 前半小时离场车辆数为:1 辆;
# 郑州机场出租车秩序管理站 截止目前为止(2019-09-14 07:44:27) 场内待运车辆数为:81 辆(场内待运较多); 前半小时进场车辆数为:18 辆; 前半小时离场车辆数为:1 辆;
# 郑州机场出租车秩序管理站 截止目前为止(2019-09-14 07:44:38) 场内待运车辆数为:81 辆(场内待运较多); 前半小时进场车辆数为:18 辆; 前半小时离场车辆数为:1 辆;
# 郑州机场出租车秩序管理站 截止目前为止(2019-09-14 07:44:50) 场内待运车辆数为:81 辆(场内待运较多); 前半小时进场车辆数为:18 辆; 前半小时离场车辆数为:1 辆;
# 郑州机场出租车秩序管理站 截止目前为止(2019-09-14 07:45:01) 场内待运车辆数为:81 辆(场内待运较多); 前半小时进场车辆数为:18 辅辆; 前半小时离场车辆数为:1 辆;
# """
3. 使用正则表达式匹配数据
我们使用正则表达式来提取文件中的时间戳和前半小时离场车辆数。这里的正则表达式模式匹配类似于(2023-09-14 08:30:00)前半小时离场车辆数为:123 辆;
的文本。
# 正则表达式匹配时间和前半小时离场车辆数
pattern = r"((\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2})).*?前半小时离场车辆数为:(\d+) 辆;"
matches = re.findall(pattern, data) # 使用正则表达式查找所有匹配的模式
4. 解析匹配结果
将匹配到的时间字符串转换为datetime
对象,并将离场车辆数转换为整数:
# 解析匹配结果
timestamps = [datetime.strptime(match[0], "%Y-%m-%d %H:%M:%S") for match in matches] # 将匹配到的时间字符串转换为datetime对象
leaving_counts = [int(match[1]) for match in matches] # 将匹配到的离场车辆数转换为整数
5. 设置字体
为了支持中文显示,我们需要设置字体。这里假设我们使用的是SimHei字体:
# 设置字体
font_path = 'C:/Windows/Fonts/simhei.ttf' # 你可以根据需要更改字体路径
font_prop = fm.FontProperties(fname=font_path) # 创建字体属性对象
6. 绘制折线图
使用matplotlib
绘制离场车辆数随时间变化的折线图:
# 绘制折线图
plt.figure(figsize=(10, 6)) # 设置图表大小
plt.plot(timestamps, leaving_counts, marker='o', markersize=1, linestyle='-', color='b') # 绘制折线图,设置节点样式和颜色
plt.title("前半小时离场车辆数随时间的变化", fontproperties=font_prop) # 设置图表标题
plt.xlabel("时间", fontproperties=font_prop) # 设置X轴标签
plt.ylabel("前半小时离场车辆数", fontproperties=font_prop) # 设置Y轴标签
plt.grid(True) # 显示网格
plt.xticks(rotation=45, fontproperties=font_prop) # 旋转X轴刻度标签以防止重叠
plt.yticks(fontproperties=font_prop) # 设置Y轴刻度标签的字体
plt.tight_layout() # 自动调整子图参数以适应图形区域
# 调整边距以确保字体不被遮盖
plt.subplots_adjust(left=0.15, bottom=0.2) # 调整图表的左边距和下边距
# 保存图片
plt.savefig('离场车辆数变化图.png') # 将图表保存为PNG文件
# 显示图表
plt.show() # 显示图表
7. 完整代码
以下是完整的代码片段,包含了从读取数据到绘制并保存图表的所有步骤:
import re
import matplotlib.pyplot as plt
from datetime import datetime
import matplotlib.font_manager as fm
# 文件路径
file_paths = ['郑州机场9月14上午原始数据.txt', '郑州机场9月14下午原始数据.txt']
# 初始化数据列表
data = ''
# 读取文件内容
for file_path in file_paths:
with open(file_path, 'r', encoding='utf-8') as file:
data += file.read() # 读取文件中的所有内容并合并
# 正则表达式匹配时间和前半小时离场车辆数
pattern = r"((\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2})).*?前半小时离场车辆数为:(\d+) 辆;"
matches = re.findall(pattern, data) # 使用正则表达式查找所有匹配的模式
# 解析匹配结果
timestamps = [datetime.strptime(match[0], "%Y-%m-%d %H:%M:%S") for match in matches] # 将匹配到的时间字符串转换为datetime对象
leaving_counts = [int(match[1]) for match in matches] # 将匹配到的离场车辆数转换为整数
# 设置字体
font_path = 'C:/Windows/Fonts/simhei.ttf' # 你可以根据需要更改字体路径
font_prop = fm.FontProperties(fname=font_path) # 创建字体属性对象
# 绘制折线图
plt.figure(figsize=(10, 6)) # 设置图表大小
plt.plot(timestamps, leaving_counts, marker='o', markersize=1, linestyle='-', color='b') # 绘制折线图,设置节点样式和颜色
plt.title("前半小时离场车辆数随时间的变化", fontproperties=font_prop) # 设置图表标题
plt.xlabel("时间", fontproperties=font_prop) # 设置X轴标签
plt.ylabel("前半小时离场车辆数", fontproperties=font_prop) # 设置Y轴标签
plt.grid(True) # 显示网格
plt.xticks(rotation=45, fontproperties=font_prop) # 旋转X轴刻度标签以防止重叠
plt.yticks(fontproperties=font_prop) # 设置Y轴刻度标签的字体
plt.tight_layout() # 自动调整子图参数以适应图形区域
# 调整边距以确保字体不被遮盖
plt.subplots_adjust(left=0.15, bottom=0.2) # 调整图表的左边距和下边距
# 保存图片
plt.savefig('离场车辆数变化图.png') # 将图表保存为PNG文件
# 显示图表
plt.show() # 显示图表
通过以上步骤,我们实现了从原始数据文件中提取数据并绘制离场车辆数随时间变化的折线图。这样的方法不仅可以用于分析机场的交通情况,还可以应用于其他类似的数据分析场景。