我有一个 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