分子分母归属月份字段更新

This commit is contained in:
2026-01-06 16:24:35 +08:00
parent cf3814b3c2
commit 923c035fd5
9 changed files with 171 additions and 39 deletions
+1 -1
View File
@@ -185,7 +185,7 @@ class CommonModule:
# 获取指定天数前的日期
now_time = datetime.now()
yes_time = now_time + timedelta(days=-2)
yes_time = now_time + timedelta(days=-2) # 防止NGV没更新
yes_time_nyr = int(yes_time.strftime('%Y%m%d')) # 获取前两天日期
# 获取指定天数前的日期
+29
View File
@@ -141,3 +141,32 @@ Traceback (most recent call last):
import numpy.typing as typing
^^^^^^^^^^^^^^^^^^^^^^^
ModuleNotFoundError: No module named 'numpy.rec'
2026-01-06 16:04:19,673 - log_config.py - error_task_logger - ERROR - 任务执行失败: Can only use .dt accessor with datetimelike values
Traceback (most recent call last):
File "D:\Idea Project\SaaS_V1.7\back_ground_module\update_molecule_reporting_adjustment_to_bi.py", line 207, in main
df['归属月份'] = df['归属月份'].dt.tz_localize(None).dt.strftime('%Y-%m-%d %H:%M:%S')
^^^^^^^^^^^^^^^^^
File "D:\Program Files\anaconda3\envs\SaaS\Lib\site-packages\pandas\core\generic.py", line 6321, in __getattr__
return object.__getattribute__(self, name)
~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^
File "D:\Program Files\anaconda3\envs\SaaS\Lib\site-packages\pandas\core\accessor.py", line 224, in __get__
accessor_obj = self._accessor(obj)
File "D:\Program Files\anaconda3\envs\SaaS\Lib\site-packages\pandas\core\indexes\accessors.py", line 643, in __new__
raise AttributeError("Can only use .dt accessor with datetimelike values")
AttributeError: Can only use .dt accessor with datetimelike values. Did you mean: 'at'?
2026-01-06 16:14:24,812 - log_config.py - error_task_logger - ERROR - 写入数据时发生错误: overflow encountered in multiply
Traceback (most recent call last):
File "D:\Idea Project\SaaS_V1.7\back_ground_module\update_denominator_reporting_adjustment_to_bi.py", line 157, in write_to_bi
dt_utc = pd.to_datetime(timestamp_ms, unit='ms', utc=True)
File "D:\Program Files\anaconda3\envs\SaaS\Lib\site-packages\pandas\core\tools\datetimes.py", line 1072, in to_datetime
values = convert_listlike(arg._values, format)
File "D:\Program Files\anaconda3\envs\SaaS\Lib\site-packages\pandas\core\tools\datetimes.py", line 409, in _convert_listlike_datetimes
return _to_datetime_with_unit(arg, unit, name, utc, errors)
File "D:\Program Files\anaconda3\envs\SaaS\Lib\site-packages\pandas\core\tools\datetimes.py", line 517, in _to_datetime_with_unit
arr = cast_from_unit_vectorized(arg, unit=unit)
File "pandas/_libs/tslibs/conversion.pyx", line 149, in pandas._libs.tslibs.conversion.cast_from_unit_vectorized
File "D:\Program Files\anaconda3\envs\SaaS\Lib\site-packages\numpy\_core\fromnumeric.py", line 3674, in round
return _wrapfunc(a, 'round', decimals=decimals, out=out)
File "D:\Program Files\anaconda3\envs\SaaS\Lib\site-packages\numpy\_core\fromnumeric.py", line 54, in _wrapfunc
return bound(*args, **kwds)
FloatingPointError: overflow encountered in multiply
@@ -63,7 +63,8 @@ class DenominatorReportingAdjustment:
"总部调整结果": "selectField_lfqwg05y",
"总部核对结果": "selectField_lfqwg05x",
"是否上传衡石": "selectField_mca5shoz",
"是否计入应续约数": "selectField_mdnwwvyo"
"是否计入应续约数": "selectField_mdnwwvyo",
"归属月份": "dateField_mjtprnxl",
}
def get_yida_data(self):
@@ -146,15 +147,31 @@ class DenominatorReportingAdjustment:
# 处理日期字段 - 新增部分
date_fields = ['开户日期', '开始时间', '结束时间']
date_fields = ['开户日期', '开始时间', '结束时间', "归属月份"]
# 处理日期字段 - 安全版本
for field in date_fields:
if field in df.columns:
# 转换为整数类型
df[field] = pd.to_numeric(df[field], errors='coerce').astype('Int64')
# 转换为datetime对象
df[field] = pd.to_datetime(df[field], unit='ms')
# 转换为MySQL兼容的字符串格式
df[field] = df[field].dt.strftime('%Y-%m-%d %H:%M:%S')
# 1. 先确保是数值类型,非数字转为 NaN
numeric_series = pd.to_numeric(df[field], errors='coerce')
# 2. 设置合理的时间戳范围(毫秒)
# 1970-01-01 到 2100-12-31
min_ts = 0
max_ts = 4102444799999 # 2100-12-31 23:59:59.999 UTC 毫秒
# 3. 过滤掉超出范围的值(设为 NaN)
valid_mask = (numeric_series >= min_ts) & (numeric_series <= max_ts)
safe_timestamps = numeric_series.where(valid_mask)
# 4. 转换为 datetime(只对有效值转换)
try:
dt_utc = pd.to_datetime(safe_timestamps, unit='ms', utc=True)
dt_shanghai = dt_utc.dt.tz_convert('Asia/Shanghai')
dt_naive = dt_shanghai.dt.tz_localize(None)
df[field] = dt_naive.dt.strftime('%Y-%m-%d %H:%M:%S')
except Exception as e:
error_task_logger.warning(f"字段 '{field}' 时间转换失败,全部置空: {e}")
df[field] = None
df = df.replace([None, np.nan, pd.NA, 'nan', 'NaN', 'NAN', ''], None)
@@ -88,6 +88,10 @@ class MoleculeReportingAdjustment:
if id_in_map == field_id:
transformed_data[display_name] = value
break
# BI上已经实现
# if transformed_data.get("是否上传衡石") == "否" or transformed_data.get("是否上传衡石") is None:
# continue
@@ -193,11 +197,21 @@ class MoleculeReportingAdjustment:
df = pd.DataFrame(self.molecule_data_list)
# df.to_csv('molecule_data.csv', index=False)
if '归属月份' in df.columns:
# 确保是整数类型
df['归属月份'] = df['归属月份'].astype('Int64')
# 转换为datetime对象
df['归属月份'] = pd.to_datetime(df['归属月份'], unit='ms')
# 转换为MySQL兼容的字符串格式
# 1. 先将所有值转为数值,无法转换的变成 NaN
timestamp_ms = pd.to_numeric(df['归属月份'], errors='coerce')
# 2. 只对有效数值(非 NaN)进行 datetime 转换
# unit='ms', origin='unix' (默认), utc=True 表示输入是 UTC 毫秒时间戳
df['归属月份'] = pd.to_datetime(timestamp_ms, unit='ms', utc=True)
# 3. 转换时区到 UTC+8Asia/Shanghai
df['归属月份'] = df['归属月份'].dt.tz_convert('Asia/Shanghai')
# 4. 移除时区信息(因为 MySQL DATETIME 不支持时区)
df['归属月份'] = df['归属月份'].dt.tz_localize(None)
# 5. 格式化为字符串(可选:如果你写入的是 DATETIME 字段,其实可以保持 datetime 类型,pymysql 会自动处理)
# 但你当前 write_to_bi 用的是 %s 插入,所以需要字符串
df['归属月份'] = df['归属月份'].dt.strftime('%Y-%m-%d %H:%M:%S')
# step2:清空BI数据表