列车乘客到达时间分布应用于车次数据的实现方法咨询
实现方案
方法一:Python Pandas 处理
这是批量处理最灵活的方案,适合数据量较大的场景:
- 数据预处理:把车次数据和占比数据读取为DataFrame,将发车时间转为
datetime类型,发车前时长转为timedelta类型,占比去掉百分号后转成小数(比如0.1%转0.001)。 - 交叉关联数据:通过添加辅助键实现两个数据集的全量匹配,让每条车次数据对应24条占比记录。
- 计算核心字段:
- 到达时间:用发车时间减去发车前时长得到对应区间的乘客到达时间
- 区间乘客数:总乘客数乘以对应区间的占比,可根据需求取整
- 输出结果:保留需要的字段(列车编号、到达时间、区间乘客数等),导出为CSV或Excel格式
示例代码:
import pandas as pd # 加载车次数据(实际可从文件读取) train_data = pd.DataFrame({ '列车编号': ['11111', '11112'], '乘客数量': [750, 900], '发车时间': pd.to_datetime(['2018-01-01 07:00:00', '2018-01-01 08:00:00']) }) # 加载占比数据(实际可从文件读取) arrival_ratio = pd.DataFrame({ '发车前时长': pd.to_timedelta(['02:00:00', '01:55:00', '01:50:00']), '到达占比': [0.001, 0.005, 0.011] # 提前转换为小数 }) # 交叉连接两个数据集 cross_data = train_data.assign(key=1).merge(arrival_ratio.assign(key=1), on='key').drop('key', axis=1) # 计算到达时间和区间乘客数 cross_data['到达时间'] = cross_data['发车时间'] - cross_data['发车前时长'] cross_data['区间乘客数'] = cross_data['乘客数量'] * cross_data['到达占比'] cross_data['区间乘客数'] = cross_data['区间乘客数'].round().astype(int) # 取整 # 整理输出 result = cross_data[['列车编号', '到达时间', '区间乘客数']] print(result) # 导出到Excel # result.to_excel('乘客到达记录.xlsx', index=False)
方法二:SQL 处理(以MySQL为例)
适合已有数据库存储数据的场景:
- 创建数据表:分别存储车次数据(
train_schedule)和占比数据(arrival_ratio),注意字段类型匹配(发车时间用DATETIME,发车前时长用TIME,占比用DECIMAL)。 - 交叉关联查询:用
CROSS JOIN实现两个表的全量匹配。 - 计算字段:用
DATE_SUB函数计算到达时间,用乘法+ROUND函数计算区间乘客数。
示例SQL:
-- 创建车次表 CREATE TABLE train_schedule ( 列车编号 VARCHAR(10), 乘客数量 INT, 发车时间 DATETIME ); INSERT INTO train_schedule VALUES ('11111', 750, '2018-01-01 07:00:00'), ('11112', 900, '2018-01-01 08:00:00'); -- 创建占比表 CREATE TABLE arrival_ratio ( 发车前时长 TIME, 到达占比 DECIMAL(5,3) ); INSERT INTO arrival_ratio VALUES ('02:00:00', 0.001), ('01:55:00', 0.005), ('01:50:00', 0.011); -- 生成结果查询 SELECT ts.列车编号, DATE_SUB(ts.发车时间, INTERVAL ar.发车前时长 HOUR_SECOND) AS 到达时间, ROUND(ts.乘客数量 * ar.到达占比) AS 区间乘客数 FROM train_schedule ts CROSS JOIN arrival_ratio ar ORDER BY ts.列车编号, 到达时间 DESC;
方法三:Excel Power Query 处理
适合非技术人员快速操作:
- 将两份数据分别放到Excel的两个工作表(如“车次数据”“占比数据”)。
- 打开Power Query,分别导入两个工作表的数据。
- 预处理占比数据:移除“到达占比”列的百分号,转成小数;确保“发车前时长”为时间类型。
- 交叉合并数据:添加一个值为
1的辅助列到两个数据集,通过辅助列做合并查询,实现全量匹配。 - 添加计算列:
- 到达时间:
= [发车时间] - [发车前时长] - 区间乘客数:
= ROUND([乘客数量] * [到达占比], 0)
- 到达时间:
- 整理列,移除冗余字段后加载回Excel。
内容的提问来源于stack exchange,提问作者digidrago
相关产品推荐
相关产品推荐

