【发布时间】:2017-05-17 14:20:27
【问题描述】:
我正在使用 psycopg2 和 sqlalchemy 将数据从 xls 文件插入到 postgres db 中。我以前在插入“日期”列时遇到问题,这些列在 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 时间戳最大值,因为我之前得到了时间戳的“范围超出范围”:
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 的最后一行代码有关吗?有什么方法可以追踪问题所在吗?
提前致谢。
【问题讨论】:
-
IIUC 您可以使用
df[i] = pd.to_datetime(df[i], format="%dd.%m.%Y", errors='coerce')将无日期时间值转换为NaT -
@jezrael 我之前尝试过,但是 psycopg2 然后给了我一个错误,见上文。
-
@jezrael 是 'NaT' 还是 'NaN' 作为数据库值的黑客攻击?我不确定问题出在 psycopg2 还是 postgres
-
我更改了信息,因为我能够将 excel 数字日期转换为 python 日期。