我使用psycopg2和sqlalchemy在xls文件的postgres数据库中插入数据。我以前在插入“约会”时遇到了问题。已在excel中格式化为数字的列。我们已在postgres中将这些列定义为日期类型。
我这里有两个问题:
1.日期列中的某些值为空。 Pandas将这些值转换为NaT
或NaN
,但sqlalchemy和psycopg2无法解析。
df = pd.read_excel(full_path, encoding='utf-8')
dict_items = df.to_dict(orient='records')
table = sql.Table(table_name, engine, schema='users')
connection.execute(table.insert().values(dict_items))
<class 'sqlalchemy.exc.DataError'>, DataError('(psycopg2.DataError) invalid input syntax for type timestamp: "NaT"
我已经通过下面的代码将数字转换为python日期,但也必须确保日期不会比Pandas timestamp max更大,因为我之前有一个&#39; Range Out of Bounds&#39;对于时间戳:
max_date = pd.Timestamp.max
for index, row in df.iterrows():
for col in date_cols:
date_value = row[col]
if not np.isnan(date_value):
year, month, day, hour, minute, sec = xlrd.xldate_as_tuple(date_value, 0)
py_date = "%02d.%02d.%04d" % (month, day, year)
if py_date > str(max_date):
df.loc[index, col] = pd.to_datetime(max_date)
else:
df.loc[index, col] = py_date
if np.isnan(date_value):
df.loc[index, col] = pd.to_datetime('01.12.2016')
现在我收到以下错误:
<class 'sqlalchemy.exc.DataError'>, DataError('(psycopg2.DataError) integer out of range\n',)<traceback object at>
这可能与我推送01.12.2016
的最后一行代码有关吗?是否有某种方法来追踪问题所在?
提前致谢。
答案 0 :(得分:2)
要解决nan和nat的问题,只需在数据框中将它们更改为None,然后就可以插入它们而不会提出投诉。这样就解决了我的问题。
df = df.where(pd.notnull(df), None)
我从postgres message board得到了这个解决方案,其中显示了一个小例子,说明nans变成了None
答案 1 :(得分:0)
另一种对我有用的替代方法
import numpy as np
df = df.replace({np.nan: None})