【问题标题】:psycopg2 - acceptable date/datetime valuespsycopg2 - 可接受的日期/日期时间值
【发布时间】:2017-05-17 14:20:27
【问题描述】:

我正在使用 psycopg2 和 sqlalchemy 将数据从 xls 文件插入到 postgres db 中。我以前在插入“日期”列时遇到问题,这些列在 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 时间戳最大值,因为我之前得到了时间戳的“范围超出范围”:

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 日期。

标签: datetime pandas psycopg2


【解决方案1】:

要解决 nan's 和 nat's 的问题,只需在数据框中将它们更改为 None,然后它们应该会毫无怨言地插入。它解决了我的问题。

df = df.where(pd.notnull(df), None)

我从postgres message board 获得了这个解决方案,他们展示了一个将 nans 更改为 None 的小例子

【讨论】:

    【解决方案2】:

    另一种对我有用的替代方法

    import numpy as np
    df = df.replace({np.nan: None})
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-08
      • 1970-01-01
      • 2011-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多