0

我在 python 中有一段代码,它从 excel 文件中读取并保存到 redshift 数据库中。

import psycopg2
def from_redshift():
    book = xlrd.open_workbook("excelfile.xlsx")
    sheet = book.sheet_by_index(0)

    con = psycopg2.connect(dbname='dbname', host='something.com', port=portnum, user='username', password='password')
    cursor=con.cursor()

    query = """INSERT INTO table_name (col1, col2, col3, start_date, update_date) VALUES (%s, %s, %s, %s, %s)"""
    for r in range(1, sheet.nrows):
        col1 = sheet.cell(r,0).value
        col2 = sheet.cell(r,1).value

        col3 = sheet.cell(r,2).value
        start_date     = sheet.cell(r,3).value
        update_date = sheet.cell(r,4).value

        # Assign values from each row
        values = (col1, col2, col3, start_date, update_date)

        # Execute sql Query
        cursor.execute(query, values)
        print("Executed")
    # Close the cursor
    cursor.close()

该代码在读取和插入数据库时​​工作正常,但我的问题是' start_date'​​和' update_date'字段datetime在数据库中,所以当我尝试插入时,它给了我来自这两列的值的错误格式不正确,当我将这两列更改varchar为数据库时,它插入的这些值是一些奇怪的数字23.12345(类似的东西)。

这两列中的值看起来像YYYY-MM-DD HH:MM:[SS](自定义格式)。

如何正确获取数据库中的这些日期时间值?

    # Commit the transaction
    con.commit()
    con.close()
4

1 回答 1

1

来自xlrd 上的文档

要读取日期值,您可以使用xldate_as_tuple 函数

因为日期以数字形式存储在 excel 文件格式中

我没有对此进行测试,但是使用您的代码:

def from_redshift():
    book = xlrd.open_workbook("excelfile.xlsx")
    sheet = book.sheet_by_index(0)

    for r in range(1, sheet.nrows):
        start_date     = xldate_as_tuple(sheet.cell(r,3).value, book.datemode)
        start_date = datetime.datetime(*start_date)

顺便说一句,如果您的方法名称表明您在做什么。如果您将此数据加载到 AWS Redshift 中,从 CSV 文件复制总是更快、更容易,并且通常建议您从这样的 excel 数据中执行插入操作。

于 2017-08-02T00:00:14.757 回答