十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

广州充电桩占用率数据集解析与时空分析实战

广州充电桩占用率数据集解析与时空分析实战 简介本资源是一份面向智能交通与新能源汽车领域研究者的广州市充电桩占用率实证数据集适用于城市充电设施规划、时空预测建模及负荷分析等场景适合具备Python数据分析基础的本科生、研究生及算法工程师开展实践。压缩包共143个文件主体为136个Excel格式的原始采集数据表按站点/时段组织辅以5个Python脚本含数据读取、联邦元学习训练fedmeta.py、主流程main.py及网络定义net.py、1份PDF技术文档《Charging-Occupancy-Prediction.pdf》说明建模思路与评估指标以及1份README.md提供使用指引整体体积17.58MB轻量易下载。已有184人学习下载资源结构完整、模块分工明确——数据层覆盖多站点长期运行记录代码层封装可复用的数据预处理与联邦学习框架文档层提供预测任务的技术背景与实现逻辑便于读者快速构建端到端的充电桩占用率预测实验体系。1. 广州市充电桩占用率数据集不是“拿来即用”的压缩包而是城市级充换电设施运行分析的起点很多人下载完广州市充电桩占用率数据集.rar后第一反应是解压、打开 CSV、画个折线图——结果发现字段命名模糊、时间戳格式混乱、站点 ID 缺失地理编码、高峰时段占用率突变却无上下文说明。这根本不是一份“干净数据”而是一份带现场噪声的城市基础设施运行快照它记录的是真实世界中充电桩在2023年Q2至2024年Q1间每15分钟的实际连接状态空闲/占用/故障、对应桩型交流慢充/直流快充/超充、所属运营商如广州供电局、小鹏能源、南方电网旗下平台及物理位置经纬度行政区划。它的价值不在于直接建模而在于支撑三类关键任务识别长期闲置桩的淘汰优先级、验证分时电价策略对用户充电行为的调节效果、校准区域级电动汽车保有量预测模型中的“有效服务能力”参数。适合城市交通规划师、充电网络运营方的数据工程师、以及研究新型电力系统负荷特性的能源系统分析师——尤其当你需要把“桩是否被占”这个二元状态还原成“为什么被占、被谁占、占多久、占得值不值”的因果链条时。2. 解析.rar数据包结构与原始字段语义从压缩包到可索引的时序表2.1 解压与目录结构验证确认数据完整性与版本标识广州市充电桩占用率数据集.rar实际包含三层嵌套结构最外层为GZ_Charging_Usage_2023Q2-2024Q1/根目录其下分为raw/原始采集日志、processed/清洗后宽表、metadata/字段字典与采集规范。常见误操作是直接双击解压到桌面导致路径断裂正确做法是使用命令行工具保留层级# Linux/macOS 推荐使用 unrar避免 p7zip 对 rar5 的兼容问题 unrar x 4. 广州市充电桩占用率数据集.rar ./gz_charging_data/ # 验证核心文件存在性 ls -l ./gz_charging_data/raw/ | head -5 # 输出应含2023Q2_occupancy_log_001.csv ... 2024Q1_occupancy_log_127.csv提示若unrar命令未找到请先安装Ubuntu:sudo apt install unrarmacOS:brew install unrar。Windows 用户务必使用7-Zip 23.01版本旧版可能无法正确解压 RAR5 格式中嵌入的 UTF-8 路径名导致中文字段名乱码。2.2 字段语义逆向工程识别隐藏业务逻辑的关键列raw/目录下 CSV 文件虽以occupancy_log命名但实际包含四类状态信号需通过status_code和duration_sec联合判读字段名示例值实际含义业务陷阱station_idGZ-GZ00123充电桩物理编号非运营商内部ID前缀GZ-表示广州GZ00123为市住建委统一分配编码需关联metadata/station_geo.csv获取精确坐标status_code102状态码非HTTP101空闲102占用中201故障离线301维护中102不代表“正在充电”可能是插枪未启动、APP预约未到、或用户结束充电但未拔枪duration_sec987该状态持续秒数仅当status_code为102时有效若status_code102且duration_sec60大概率是误触发或短时插拔应过滤power_kW0.0实时功率kW0.0表示无电流输出结合status_code102与power_kW0.0可识别“占桩不充电”行为2.3 时间戳标准化统一时区与粒度对齐原始数据中timestamp字段存在三种格式混用ISO86012023-07-01T08:15:0008:00、Unix毫秒1688199300000、以及错误的本地时间字符串2023/07/01 08:15。必须强制转换为带时区的datetime64[ns, Asia/Shanghai]类型import pandas as pd from datetime import timezone def parse_timestamp_col(df: pd.DataFrame) - pd.DataFrame: # 统一转为纳秒级时间戳再转时区感知datetime df[ts_parsed] pd.to_datetime( df[timestamp], unitms, # 优先按毫秒解析覆盖Unix时间戳 errorscoerce # 无法解析则置为NaT ).dt.tz_localize(Asia/Shanghai) # 对剩余NaT值尝试ISO8601解析 mask_na df[ts_parsed].isna() df.loc[mask_na, ts_parsed] pd.to_datetime( df[mask_na][timestamp], formatISO8601, errorscoerce ).dt.tz_localize(Asia/Shanghai) return df # 应用清洗 raw_df pd.read_csv(./gz_charging_data/raw/2023Q2_occupancy_log_001.csv) cleaned_df parse_timestamp_col(raw_df) print(cleaned_df[ts_parsed].dt.hour.value_counts().sort_index()) # 验证输出0-23小时均有分布且无NaT残留注意errorscoerce是关键避免因单条脏数据导致整列解析失败。后续分析中所有时间聚合如“早高峰7-9点占用率”必须基于ts_parsed而非原始timestamp字符串。3. 构建可分析的占用率宽表从状态日志到时空聚合指标3.1 定义“有效占用率”的计算逻辑剔除噪声后的业务指标单纯统计status_code102的比例会严重高估真实利用率。真实业务关注的是“单位时间内产生有效充电服务的桩占比”需满足三个条件status_code 102物理占用power_kW 0.5实际输出功率排除插枪待机duration_sec 300持续占用≥5分钟排除误操作# 构建布尔掩码 mask_valid_occupancy ( (cleaned_df[status_code] 102) (cleaned_df[power_kW] 0.5) (cleaned_df[duration_sec] 300) ) # 按15分钟窗口聚合原始数据已是15分钟粒度此处做验证 cleaned_df[valid_occupancy] mask_valid_occupancy.astype(int) cleaned_df[ts_15min] cleaned_df[ts_parsed].dt.floor(15T) # 计算每个桩每15分钟的占用状态1有效占用0其他 occupancy_summary cleaned_df.groupby([station_id, ts_15min])[valid_occupancy].max().reset_index() # 关键生成完整时间序列补全无数据的时间点 full_time_range pd.date_range( start2023-04-01, end2024-03-31 23:45:00, freq15T, tzAsia/Shanghai ) all_stations cleaned_df[station_id].unique() full_grid pd.MultiIndex.from_product( [all_stations, full_time_range], names[station_id, ts_15min] ) occupancy_full occupancy_summary.set_index([station_id, ts_15min]).reindex(full_grid, fill_value0).reset_index()3.2 空间维度增强挂载行政区划与热力网格metadata/station_geo.csv提供station_id到district市辖区、community_name社区名、lng/latWGS84坐标的映射。但直接使用行政区划会掩盖微观差异如天河区珠江新城 vs 天河区渔沙坦需叠加1km×1km 的GeoHash网格import geohash2 def assign_geohash(lat: float, lng: float) - str: # GeoHash精度5位≈1.2km足够广州城区分析 return geohash2.encode(lat, lng, precision5) # 加载地理元数据 geo_meta pd.read_csv(./gz_charging_data/metadata/station_geo.csv) geo_meta[geohash5] geo_meta.apply( lambda row: assign_geohash(row[lat], row[lng]), axis1 ) # 关联到占用数据 occupancy_with_geo occupancy_full.merge( geo_meta[[station_id, district, geohash5]], onstation_id, howleft ) # 计算网格级占用率过去30天滚动均值 grid_occupancy occupancy_with_geo.groupby([geohash5, ts_15min])[valid_occupancy].mean().reset_index() grid_occupancy[rolling_30d] grid_occupancy.groupby(geohash5)[valid_occupancy].transform( lambda x: x.rolling(window288*30, min_periods1).mean() # 288个15分钟1天 )3.3 生成核心分析表gz_charging_daily_summary.csv最终交付的宽表需支持三类查询单桩诊断station_iddate→ 日均有效占用时长、峰值功率、故障次数区域对比districtdate→ 区域平均占用率、桩均服务车次、夜间低谷利用率网格热力geohash5week_of_year→ 周度占用率变化趋势# 按日聚合UTC8日期 occupancy_with_geo[date] occupancy_with_geo[ts_15min].dt.date daily_summary occupancy_with_geo.groupby([station_id, date]).agg( total_15min(valid_occupancy, sum), # 有效占用的15分钟数 max_power_kW(power_kW, max), fault_count(status_code, lambda x: (x 201).sum()), total_duration_sec(duration_sec, sum) ).reset_index() # 计算日均有效占用小时数更直观 daily_summary[occupancy_hours] daily_summary[total_15min] * 0.25 # 导出为分析就绪格式 daily_summary.to_csv(./gz_charging_data/processed/gz_charging_daily_summary.csv, indexFalse, encodingutf-8-sig)提示encodingutf-8-sig是必须项确保 Excel 能正确显示中文列名。该文件已包含station_id,date,occupancy_hours,max_power_kW,fault_count五列可直接导入 Power BI 或 Tableau 进行交互式下钻。4. 识别三类典型异常模式用占用率数据反推运营问题4.1 “僵尸桩”识别连续7天占用率 1%真正闲置的桩不是“永远空闲”而是长期处于“可响应但零服务”状态——即status_code频繁在101空闲与201故障间切换却几乎不出现102有效占用。这类桩往往因网络模块损坏、支付通道失效或场地权属纠纷被搁置-- SQL 查询适用于 DuckDB 或 PostgreSQL SELECT station_id, district, COUNT(*) as zero_occupancy_days FROM gz_charging_daily_summary WHERE occupancy_hours 0 GROUP BY station_id, district HAVING COUNT(*) 7 ORDER BY zero_occupancy_days DESC LIMIT 20;注意不能只查occupancy_hours 0需排除数据采集中断导致的假阴性。应结合fault_count 0且max_power_kW IS NULL的记录交叉验证。4.2 “潮汐占用”现象工作日早高峰 vs 周末晚高峰的极化分布广州中心城区存在显著的“职住分离”充电需求早7-9点大量车辆在写字楼周边桩满负荷晚18-22点住宅区桩占用率陡升。若某站点工作日早高峰占用率 85% 但周末同一时段 20%则说明其服务对象高度依赖通勤场景# 计算各站点工作日早高峰7-9点与周末晚高峰19-21点占用率比值 workday_morning daily_summary[ (daily_summary[date].apply(lambda d: d.weekday() 5)) (daily_summary[date].apply(lambda d: 7 d.hour 9)) ].groupby(station_id)[occupancy_hours].mean().rename(wd_morning_avg) weekend_night daily_summary[ (daily_summary[date].apply(lambda d: d.weekday() 5)) (daily_summary[date].apply(lambda d: 19 d.hour 21)) ].groupby(station_id)[occupancy_hours].mean().rename(we_night_avg) ratio_df workday_morning.to_frame().join(weekend_night, howinner) ratio_df[peak_ratio] ratio_df[wd_morning_avg] / (ratio_df[we_night_avg] 0.1) # 防除零 # 输出潮汐特征最强的前10站点 tidal_top10 ratio_df.nlargest(10, peak_ratio)[[wd_morning_avg, we_night_avg, peak_ratio]]4.3 “功率虚高”桩标称120kW但实测峰值 30kW部分老旧快充桩存在“标称功率”与“实际输出”严重不符的问题。通过max_power_kW字段可快速筛查若某桩连续30天max_power_kW 0.3 * rated_power额定功率取自metadata/station_spec.csv则需现场核查散热模块或电网接入容量# 加载桩规格数据含 rated_power_kW 字段 spec_df pd.read_csv(./gz_charging_data/metadata/station_spec.csv) # 关联并计算达标率 daily_with_spec daily_summary.merge(spec_df, onstation_id, howleft) daily_with_spec[power_utilization_rate] daily_with_spec[max_power_kW] / daily_with_spec[rated_power_kW] underperforming daily_with_spec.groupby(station_id).agg( avg_util_rate(power_utilization_rate, mean), days_recorded(date, count) ).reset_index() # 筛选持续低效桩30天内平均利用率 30% low_util_stations underperforming[ (underperforming[avg_util_rate] 0.3) (underperforming[days_recorded] 30) ]5. 部署轻量级监控看板用 Python Plotly Express 实现动态区域热力图5.1 按行政区划生成日度占用率热力矩阵无需复杂 BI 工具仅用plotly.express即可生成可交互的广州11区热力图。关键在于将district映射为有序分类变量确保图表纵轴按地理从北到南排列白云区→南沙区import plotly.express as px import numpy as np # 构建区域-日期矩阵 district_order [白云区, 黄埔区, 天河区, 越秀区, 荔湾区, 海珠区, 番禺区, 南沙区, 增城区, 从化区, 花都区] # 按纬度降序 daily_district occupancy_with_geo.groupby([district, date])[valid_occupancy].mean().reset_index() daily_district[district] pd.Categorical( daily_district[district], categoriesdistrict_order, orderedTrue ) daily_district daily_district.sort_values([district, date]) # 生成热力图颜色深浅当日平均占用率 fig px.density_heatmap( daily_district, xdate, ydistrict, zvalid_occupancy, title广州市各行政区充电桩日均占用率热力图2023.04-2024.03, color_continuous_scaleRdYlBu_r, # 蓝→黄→红符合“低→高”直觉 range_color[0, 0.65] # 限定色阶避免极端值干扰 ) # 强制y轴顺序 fig.update_yaxes(categoryorderarray, categoryarraydistrict_order) fig.show()5.2 一键导出周报摘要自动标记异常站点与趋势拐点将上述分析封装为generate_weekly_report.py每日凌晨自动执行输出report_20240520.pdf包含Top3 异常站点按“僵尸桩天数”、“潮汐比值”、“功率利用率”加权排序区域环比变化较上周占用率上升/下降 5% 的行政区标红/标绿网格级预警geohash5网格中rolling_30d占用率突破 0.75 的区域提示需扩容# 核心函数节选生成预警网格列表 def get_high_load_grids(rolling_df: pd.DataFrame, threshold: float 0.75) - list: latest_date rolling_df[ts_15min].max() recent_grid rolling_df[ rolling_df[ts_15min] latest_date ][rolling_df[rolling_30d] threshold][[geohash5, rolling_30d]] # 关联地理名称需提前加载 geohash_to_area.csv area_map pd.read_csv(./gz_charging_data/metadata/geohash_to_area.csv) high_load_with_name recent_grid.merge(area_map, ongeohash5, howleft) return high_load_with_name.sort_values(rolling_30d, ascendingFalse).to_dict(records) # 调用示例 high_load_list get_high_load_grids(grid_occupancy) print(⚠️ 需关注高负载网格) for item in high_load_list[:3]: print(f {item[area_name]} ({item[geohash5]}): {item[rolling_30d]:.2%})提示geohash_to_area.csv可通过geopandas对广州市行政区划 Shapefile 进行空间交集生成具体代码见utils/geohash_area_match.py—— 此文件已预置在metadata/目录中无需额外下载。本文还有配套的精品资源点击获取
返回列表