分子分母归属月份字段更新
This commit is contained in:
@@ -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')) # 获取前两天日期
|
||||
|
||||
# 获取指定天数前的日期
|
||||
|
||||
@@ -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+8(Asia/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数据表
|
||||
|
||||
Reference in New Issue
Block a user