From 5e53157a78c9fe1c7f9654eae712c623fff8a304 Mon Sep 17 00:00:00 2001 From: z66 <1415243231@qq.com> Date: Thu, 25 Dec 2025 15:35:03 +0800 Subject: [PATCH] =?UTF-8?q?=E9=9D=9E=E6=A0=87=E4=B8=9A=E7=BB=A9=E6=8F=90?= =?UTF-8?q?=E6=8A=A5=E3=80=81=E5=90=88=E4=BC=99=E4=BA=BA=E7=BB=93=E7=AE=97?= =?UTF-8?q?=E7=99=BB=E8=AE=B0=E5=AD=97=E6=AE=B5=E6=97=B6=E9=97=B4=E5=88=86?= =?UTF-8?q?=E5=8C=BA=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- back_ground_module/logs/error_task.log | 74 +++++++++++++++++++ .../non_standar_performance_to_BI.py | 16 ++-- .../partner_settlement_to_BI.py | 21 +++--- test/续约待办派发.py | 4 + 4 files changed, 99 insertions(+), 16 deletions(-) diff --git a/back_ground_module/logs/error_task.log b/back_ground_module/logs/error_task.log index d1a4b6d..b3dfc1d 100644 --- a/back_ground_module/logs/error_task.log +++ b/back_ground_module/logs/error_task.log @@ -30,3 +30,77 @@ Traceback (most recent call last): File "D:\ProgramTools\anaconda3\envs\saas\Lib\site-packages\pandas\core\indexes\base.py", line 3819, in get_loc raise KeyError(key) from err KeyError: '业务人员' +2025-12-25 14:47:59,066 - log_config.py - error_task_logger - ERROR - 合伙人结算登记同步到BI发生错误:"None of [Index(['订单支付时间'], dtype='object')] are in the [columns]" +Traceback (most recent call last): + File "D:\Idea Project\SaaS_V1.7\back_ground_module\partner_settlement_to_BI.py", line 297, in main + df = self.data_process() + File "D:\Idea Project\SaaS_V1.7\back_ground_module\partner_settlement_to_BI.py", line 165, in data_process + df[time_columns] = df[time_columns].apply( + ~~^^^^^^^^^^^^^^ + File "D:\ProgramTools\anaconda3\envs\saas\Lib\site-packages\pandas\core\frame.py", line 4113, in __getitem__ + indexer = self.columns._get_indexer_strict(key, "columns")[1] + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^ + File "D:\ProgramTools\anaconda3\envs\saas\Lib\site-packages\pandas\core\indexes\base.py", line 6212, in _get_indexer_strict + self._raise_if_missing(keyarr, indexer, axis_name) + ~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\ProgramTools\anaconda3\envs\saas\Lib\site-packages\pandas\core\indexes\base.py", line 6261, in _raise_if_missing + raise KeyError(f"None of [{key}] are in the [{axis_name}]") +KeyError: "None of [Index(['订单支付时间'], dtype='object')] are in the [columns]" +2025-12-25 14:48:41,241 - log_config.py - error_task_logger - ERROR - 合伙人结算登记同步到BI发生错误:"None of [Index(['订单登记表.订单支付时间'], dtype='object')] are in the [columns]" +Traceback (most recent call last): + File "D:\Idea Project\SaaS_V1.7\back_ground_module\partner_settlement_to_BI.py", line 297, in main + df = self.data_process() + File "D:\Idea Project\SaaS_V1.7\back_ground_module\partner_settlement_to_BI.py", line 165, in data_process + df[time_columns] = df[time_columns].apply( + ~~^^^^^^^^^^^^^^ + File "D:\ProgramTools\anaconda3\envs\saas\Lib\site-packages\pandas\core\frame.py", line 4113, in __getitem__ + indexer = self.columns._get_indexer_strict(key, "columns")[1] + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^ + File "D:\ProgramTools\anaconda3\envs\saas\Lib\site-packages\pandas\core\indexes\base.py", line 6212, in _get_indexer_strict + self._raise_if_missing(keyarr, indexer, axis_name) + ~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\ProgramTools\anaconda3\envs\saas\Lib\site-packages\pandas\core\indexes\base.py", line 6261, in _raise_if_missing + raise KeyError(f"None of [{key}] are in the [{axis_name}]") +KeyError: "None of [Index(['订单登记表.订单支付时间'], dtype='object')] are in the [columns]" +2025-12-25 15:31:38,149 - log_config.py - error_task_logger - ERROR - 非标业绩提报转BI发生错误Already tz-aware, use tz_convert to convert. +Traceback (most recent call last): + File "D:\Idea Project\SaaS_V1.7\back_ground_module\non_standar_performance_to_BI.py", line 287, in main + df = self.data_process() + File "D:\Idea Project\SaaS_V1.7\back_ground_module\non_standar_performance_to_BI.py", line 148, in data_process + df[time_columns] = df[time_columns].apply( + ~~~~~~~~~~~~~~~~~~~~~~^ + lambda col: pd.to_datetime(col, errors='coerce') + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + .dt.tz_localize('Asia/Shanghai') + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + .dt.strftime('%Y-%m-%d %H:%M:%S') + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + ) + ^ + File "D:\ProgramTools\anaconda3\envs\saas\Lib\site-packages\pandas\core\frame.py", line 10381, in apply + return op.apply().__finalize__(self, method="apply") + ~~~~~~~~^^ + File "D:\ProgramTools\anaconda3\envs\saas\Lib\site-packages\pandas\core\apply.py", line 916, in apply + return self.apply_standard() + ~~~~~~~~~~~~~~~~~~~^^ + File "D:\ProgramTools\anaconda3\envs\saas\Lib\site-packages\pandas\core\apply.py", line 1063, in apply_standard + results, res_index = self.apply_series_generator() + ~~~~~~~~~~~~~~~~~~~~~~~~~~~^^ + File "D:\ProgramTools\anaconda3\envs\saas\Lib\site-packages\pandas\core\apply.py", line 1081, in apply_series_generator + results[i] = self.func(v, *self.args, **self.kwargs) + ~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\Idea Project\SaaS_V1.7\back_ground_module\non_standar_performance_to_BI.py", line 150, in + .dt.tz_localize('Asia/Shanghai') + ~~~~~~~~~~~^^^^^^^^^^^^^^^^^ + File "D:\ProgramTools\anaconda3\envs\saas\Lib\site-packages\pandas\core\accessor.py", line 112, in f + return self._delegate_method(name, *args, **kwargs) + ~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\ProgramTools\anaconda3\envs\saas\Lib\site-packages\pandas\core\indexes\accessors.py", line 132, in _delegate_method + result = method(*args, **kwargs) + File "D:\ProgramTools\anaconda3\envs\saas\Lib\site-packages\pandas\core\indexes\datetimes.py", line 293, in tz_localize + arr = self._data.tz_localize(tz, ambiguous, nonexistent) + File "D:\ProgramTools\anaconda3\envs\saas\Lib\site-packages\pandas\core\arrays\_mixins.py", line 81, in method + return meth(self, *args, **kwargs) + File "D:\ProgramTools\anaconda3\envs\saas\Lib\site-packages\pandas\core\arrays\datetimes.py", line 1085, in tz_localize + raise TypeError("Already tz-aware, use tz_convert to convert.") +TypeError: Already tz-aware, use tz_convert to convert. diff --git a/back_ground_module/non_standar_performance_to_BI.py b/back_ground_module/non_standar_performance_to_BI.py index afbffff..a23e90c 100644 --- a/back_ground_module/non_standar_performance_to_BI.py +++ b/back_ground_module/non_standar_performance_to_BI.py @@ -143,13 +143,17 @@ class NonStandardPerformanceToBI: df[col] = df[col].map(lambda x: x.get("name", "") if isinstance(x, dict) else "") # 3.日期字段转为北京时间 - time_columns = ["支付日期", "开户/处理日期","提交时间","更新时间","业绩归属月","业绩归属日期"] + time_columns = ["支付日期", "开户/处理日期", "提交时间", "更新时间", "业绩归属月", "业绩归属日期"] - df[time_columns] = df[time_columns].apply( - lambda col: pd.to_datetime(col, errors='coerce') - .dt.tz_localize(None) - .dt.strftime('%Y-%m-%d %H:%M:%S') - ) + for col in time_columns: + # 1. 解析为 datetime,并明确指定为 UTC(即使原始字符串无时区) + dt_utc = pd.to_datetime(df[col], errors='coerce', utc=True) + + # 2. 转换为北京时间 + dt_beijing = dt_utc.dt.tz_convert('Asia/Shanghai') + + # 3. 去掉时区信息(变成 naive datetime),然后格式化为字符串 + df[col] = dt_beijing.dt.tz_localize(None).dt.strftime('%Y-%m-%d %H:%M:%S') # 4.处理所有配置的列表字段 if "新签阶段及提成比例" in df.columns: diff --git a/back_ground_module/partner_settlement_to_BI.py b/back_ground_module/partner_settlement_to_BI.py index a09a671..d64dbf1 100644 --- a/back_ground_module/partner_settlement_to_BI.py +++ b/back_ground_module/partner_settlement_to_BI.py @@ -139,13 +139,15 @@ class PartnerSettlementToBI: df[col] = df[col].map(lambda x: x.get("name", "") if isinstance(x, dict) else "") # 3.日期字段转为北京时间 - time_columns = ["提交时间", "更新时间","订单支付时间-核实","结算月份"] + # 3. 日期字段转为北京时间(主表) + time_columns = ["提交时间", "更新时间", "订单支付时间-核实", "结算月份"] - df[time_columns] = df[time_columns].apply( - lambda col: pd.to_datetime(col, errors='coerce') - .dt.tz_localize(None) - .dt.strftime('%Y-%m-%d %H:%M:%S') - ) + for col in time_columns: + if col in df.columns: + # 假设原始时间是 UTC(即使字符串无时区) + dt_utc = pd.to_datetime(df[col], errors='coerce', utc=True) + dt_beijing = dt_utc.dt.tz_convert('Asia/Shanghai') + df[col] = dt_beijing.dt.tz_localize(None).dt.strftime('%Y-%m-%d %H:%M:%S') # 4.处理订单登记表列表字段,将其拆分成多行 if "订单登记表" in df.columns: @@ -168,12 +170,11 @@ class PartnerSettlementToBI: time_columns_nested = ["订单支付时间"] # 来自订单登记表等嵌套结构 - # 时间字段标准化:处理订单支付时间 for col in time_columns_nested: if col in df_exploded.columns: - df_exploded[col] = pd.to_datetime(df_exploded[col], errors='coerce') \ - .dt.tz_localize(None) \ - .dt.strftime('%Y-%m-%d %H:%M:%S') + dt_utc = pd.to_datetime(df_exploded[col], errors='coerce', utc=True) + dt_beijing = dt_utc.dt.tz_convert('Asia/Shanghai') + df_exploded[col] = dt_beijing.dt.tz_localize(None).dt.strftime('%Y-%m-%d %H:%M:%S') # 删除原始的订单登记表列 df_exploded = df_exploded.drop(columns=["订单登记表"]) diff --git a/test/续约待办派发.py b/test/续约待办派发.py index 93247ef..b4b34ef 100644 --- a/test/续约待办派发.py +++ b/test/续约待办派发.py @@ -345,6 +345,10 @@ class RenewalToDo: data_NGV['60天自动流转时间'] = data_NGV['过期日'] - pd.Timedelta(days=30) data_NGV['30天自动流转时间'] = data_NGV['过期日'] - pd.Timedelta(days=0) data_NGV['0天自动流转时间'] = data_NGV['过期日'] + pd.Timedelta(days=90) + + data_NGV['120天是否跟进'] = "自动" + data_NGV['60天是否跟进']= "自动" + data_NGV['30天是否跟进']= "自动" # 格式化为字符串(去掉时区) for col in ['过期日', '120天自动流转时间', '60天自动流转时间', '30天自动流转时间', '0天自动流转时间']: data_NGV[col] = data_NGV[col].dt.strftime('%Y-%m-%d %H:%M:%S')