我正在运行一个脚本将数据从 oracle 迁移到 postgres。运行以下命令时
df = pd.read_sql(
query,
oracle_conn,
)
会导致错误
ValueError:year -10100 is out of range
对于跨越数千的某些行,有些日期已损坏并且年份数字很大。例如,下面是损坏的日期,而下一个是有效的日期。
10101-11-29 22:58:59000.
2024-03-19 18:25:49.000
是否有任何方法可以更改 read_sql,以便无论年份范围是什么,它仍然读取损坏的日期?
虽然无法直接让
read_sql
忽略年份范围错误,但可以采取一些方法来处理此问题:
1. 使用
coerce
参数将无效日期转换为
NaT
:
在
read_sql
函数中,可以使用
parse_dates
参数指定要解析为日期时间的列,并使用
coerce
参数将无效日期转换为
NaT
(Not a Time)。
python
df = pd.read_sql(
query,
oracle_conn,
parse_dates=['your_date_column'], # 替换为的日期列名
coerce_errors='coerce'
)
这会将所有无效日期替换为
NaT
,可以稍后在数据框中处理它们。
2. 在 SQL 查询中处理无效日期:
可以在 SQL 查询中直接处理无效日期。例如,可以使用
CASE
语句检查年份是否在有效范围内,如果是,则返回日期,否则返回
NULL
或其他默认值。
sql
SELECT
CASE
WHEN EXTRACT(YEAR FROM your_date_column) BETWEEN 1900 AND 2100 THEN your_date_column -- 调整年份范围
ELSE NULL -- 或其他默认值
END AS your_date_column
FROM your_table;
这将防止
read_sql
函数遇到无效日期,并允许更干净地处理数据。
3. 使用自定义转换函数:
可以编写一个自定义函数来解析日期字符串,并将其传递给
converters
参数。
```python import datetime
def parse_date(date_str): try: return datetime.datetime.strptime(date_str, '%Y-%m-%d %H:%M:%S%f') except ValueError: # 处理无效日期,例如返回 None 或引发异常 return None
df = pd.read_sql( query, oracle_conn, converters={'your_date_column': parse_date} # 替换为的日期列名 ) ```
这允许完全控制日期解析过程,并根据需要处理无效日期。
选择最佳方法取决于的具体需求和数据集中无效日期的数量。如果只需要识别和忽略无效日期,那么使用
coerce
参数是最简单的选择。但是,如果需要对无效日期执行更复杂的操作,则在 SQL 查询中处理它们或使用自定义转换函数可能更合适。