From a43a79448cde822a95a00d98e45538a5db94facf Mon Sep 17 00:00:00 2001 From: Nixevol Date: Thu, 25 Jun 2026 15:47:58 +0800 Subject: [PATCH] =?UTF-8?q?=EF=BB=BFfix:=20=E4=BF=AE=E5=A4=8D=20ISO8601=20?= =?UTF-8?q?=E6=97=A5=E6=9C=9F=E6=97=B6=E9=97=B4=E5=AF=BC=E5=85=A5=E6=97=B6?= =?UTF-8?q?=E5=8C=BA=E5=81=8F=E7=A7=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ReportScript.sql | 3 --- app/processor.py | 5 ++++- docs/project_context.md | 7 +++++++ 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/ReportScript.sql b/ReportScript.sql index 3d0c672..62239dd 100644 --- a/ReportScript.sql +++ b/ReportScript.sql @@ -53,9 +53,6 @@ UPDATE `5G_UD` SET CREATE TABLE `4G` AS SELECT * FROM `4G_UD`; CREATE TABLE `5G` AS SELECT * FROM `5G_UD`; -UPDATE `4G` SET `日期时间` = DATE_FORMAT(DATE_ADD(`日期时间`,INTERVAL 8 HOUR), '%Y-%m-%d %H:%i:%s'); -UPDATE `5G` SET `日期时间` = DATE_FORMAT(DATE_ADD(`日期时间`,INTERVAL 8 HOUR), '%Y-%m-%d %H:%i:%s'); - ALTER TABLE `4G` ADD COLUMN `日期` date NULL FIRST, MODIFY COLUMN `日期时间` datetime, diff --git a/app/processor.py b/app/processor.py index c1aa0c8..2efaf7c 100644 --- a/app/processor.py +++ b/app/processor.py @@ -754,7 +754,10 @@ class DataProcessor: try: if fmt == 'ISO8601': - temp_parsed = pd.to_datetime(series[remaining], errors='coerce', format='ISO8601') + raw = series[remaining].astype(str) + raw = raw.str.replace(r'(?:Z|[+-]\d{2}:\d{2})\s*$', '', regex=True) + raw = raw.str.replace('T', ' ', regex=False) + temp_parsed = pd.to_datetime(raw, errors='coerce') else: temp_parsed = pd.to_datetime(series[remaining], errors='coerce', format=fmt) diff --git a/docs/project_context.md b/docs/project_context.md index 6d4d53f..62ed75f 100644 --- a/docs/project_context.md +++ b/docs/project_context.md @@ -861,3 +861,10 @@ - 消除标记-删除模式:4G 部分的 DLPRB_MAX 和 CCE_MAX、5G 部分的 DLPRB_MAX 原先各用 `ADD COLUMN insert → UPDATE...JOIN → ADD INDEX → DELETE → DROP COLUMN` 五步标记并删除重复行,现改为 `INSERT...WHERE NOT EXISTS` 一步完成,共减少约 15 条冗余 DDL/DML。这正是导致 CCE_MAX JOIN 4G_MAX UPDATE 跑 >1 小时的直接原因。 - 标识符规范化:全文所有表名和列名统一加反引号,避免以数字开头的表名(如 `4G`、`5G`)和中文列名在不同 MySQL 版本或 SQL 模式下引起解析歧义。 - 业务逻辑未变:忙时取法(ULPRB > DLPRB > CCE 优先级)、结果表聚合和 IFNULL 归零逻辑均保持原样。 + +## 2026-06-25:修复 ISO8601 日期时间导入时区偏移 + +- 根因:源 CSV 中日期时间格式为 `2026-06-15T00:00:00+08:00`(ISO 8601 带时区),`pd.to_datetime(format='ISO8601')` 会自动转为 UTC(`2026-06-14 16:00:00`),导致入库后比实际壁钟时间偏移 -8 小时。 +- 修复:`processor.py::_convert_datetime_column` 在 ISO8601 解析前先用正则剥离时区后缀(`+08:00`、`-05:30`、`Z`)和 `T` 分隔符,再按朴素日期时间解析,保留原始壁钟时间。 +- SQL 清理:`ReportScript.sql` 删除 4G/5G 的 `DATE_ADD(INTERVAL 8 HOUR)` 补偿语句,因为数据导入阶段已正确保留本地时间,不再需要 SQL 层面修正。 +- 验证:`python -m compileall -q app` 通过。