psycopg2 - 可接受的日期/日期时间值

时间:2017-01-03 13:15:36

标签: datetime pandas psycopg2

我使用psycopg2和sqlalchemy在xls文件的postgres数据库中插入数据。我以前在插入“约会”时遇到了问题。已在excel中格式化为数字的列。我们已在postgres中将这些列定义为日期类型。 我这里有两个问题: 1.日期列中的某些值为空。 Pandas将这些值转换为NaTNaN,但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的最后一行代码有关吗?是否有某种方法来追踪问题所在?

提前致谢。

2 个答案:

答案 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})