2017-08-01 3 views
0

J'ai un morceau de code en python qui lit à partir d'un fichier Excel et enregistre dans la base de données redshift.Impossible de lire les valeurs de date au format correct à partir du fichier Excel et de l'enregistrer dans une base de données en utilisant python

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() 

Le code fonctionne très bien en lecture et l'insertion dans la base de données, mais ma question est que la « start_date » et les champs « update_date » sont des datetime dans la base de données, lorsque je tente d'insérer ensuite, il me donne l'erreur que les valeurs de ces deux colonnes ne sont pas dans le bon format, et quand j'ai changé ces deux colonnes à varchar dans la base de données, il insère ces valeurs sont un nombre étrange comme 23.12345 (quelque chose comme ça).

Les valeurs dans ces deux colonnes ressemblent à YYYY-MM-DD HH:MM:[SS] (format personnalisé).

Comment puis-je obtenir ces valeurs de date dans la base de données correctement?

# Commit the transaction 
    con.commit() 
    con.close() 
+0

Connexes: https://stackoverflow.com/questions/26010455/convert-xldate-to-python-datetime –

+0

Connexes: https://stackoverflow.com/questions/3727916/how-to-use-xlrd-xldate -as-tuple –

Répondre

1

De l'documentation on xlrd

Pour lire les valeurs de date, vous pouvez utiliser le xldate_as_tuple function

Parce que les dates sont stockées sous forme de numéros dans le format de fichier Excel

Je have't testé cette , mais avec votre code:

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) 

BTW, si le nom de votre méthode est une indication de ce que vous faites. Si vous chargez ces données dans AWS Redshift, la copie à partir d'un fichier CSV est toujours plus rapide, plus facile et généralement recommandée par rapport à l'exécution d'insertions à partir de données Excel comme celle-ci.

+0

S'il vous plaît donnez-moi un exemple d'utilisation de cette – akrama81