首页 > 编程问答 >如何修复“psycopg2.errors.InvalidDatetimeFormat:日期类型的输入语法无效:”-”

如何修复“psycopg2.errors.InvalidDatetimeFormat:日期类型的输入语法无效:”-”

时间:2024-07-21 14:24:22浏览次数:10  
标签:python pandas postgresql

我有一个 Excel 文件,其中包含不同的列和行,列的类型与日期不同。

一些列表已使用 pandas 从 xlsx 文件导出,然后将这些列表压缩到一个名为 result 的列表。 现在我想在 PostgreSQL 上插入该结果列表,但是当日期单元格的值为空并且还 在我的 models.py 中,我已将 datefiled 设置为 null = True,Blank= True 但出现此错误:

psycopg2.errors.InvalidDatetimeFormat:类型日期的输入语法无效:“-”

我是新来的编码。

cursor = connection.cursor()
for z in result:
    cursor.execute("""INSERT INTO 
forecast_forcast(document_number,document_name,project,discipline_code,first_Plan_issue_Date,second_Plan_issue_Date,final_Plan_issue_Date,class_num,rev,latest_status,comment_status,current_complete,responsible,weight) VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)""",z)

    connection.commit()

错误信息 "psycopg2.errors.InvalidDatetimeFormat: invalid input syntax for type date: "-" " 表明正在尝试将格式不正确的日期值插入到 PostgreSQL 数据库中。尽管已将模型中的日期字段设置为允许空值,但问题出在空日期单元格中包含了 "-" 字符,PostgreSQL 无法将其识别为有效的日期格式。

为了解决此问题,需要在将数据插入数据库之前清理和格式化日期值。以下是可以尝试的几种方法:

1. 使用 Pandas 清理数据:

  • 在将数据从 Excel 文件加载到 Pandas DataFrame 后,使用 pd.to_datetime 方法将日期列转换为日期时间对象。
  • 使用 errors='coerce' 参数将无法解析的日期值(例如 "-")转换为 NaT (Not a Time)。
  • 使用 fillna(None) NaT 值替换为 None ,以便 PostgreSQL 将其识别为空值。

```python import pandas as pd

# 从 Excel 文件加载数据 df = pd.read_excel("your_file.xlsx")

# 将日期列转换为日期时间对象 for col in ["first_Plan_issue_Date", "second_Plan_issue_Date", "final_Plan_issue_Date"]: df[col] = pd.to_datetime(df[col], errors='coerce')

# 将 NaT 值替换为 None df = df.fillna(value=None)

# 将 DataFrame 转换为列表 result = df.values.tolist() ```

2. 在插入数据之前检查和修改值:

  • 遍历 result 列表,并检查每个日期值。
  • 如果日期值为 "-",则将其替换为 None

python for row in result: for i, value in enumerate(row): if value == "-": row[i] = None

3. 使用 COPY 命令批量插入数据:

  • 将清理后的数据写入 CSV 文件。
  • 使用 PostgreSQL 的 COPY 命令将 CSV 文件中的数据批量插入到数据库中。 COPY 命令比逐行插入数据更高效,并且可以更好地处理数据类型转换。

```python # 将清理后的数据写入 CSV 文件 df.to_csv("cleaned_data.csv", index=False, header=False)

# 使用 COPY 命令插入数据 with connection.cursor() as cursor: with open("cleaned_data.csv", "r") as f: cursor.copy_from(f, "forecast_forcast", sep=",", null="") connection.commit() ```

请记住,在使用上述任何方法之前,请确保的日期列名称与数据库表中的列名称匹配。

标签:python,pandas,postgresql
From: 57543827

相关文章