2017-07-31 2 views
0

J'interroge une base de données pour obtenir un datetime, puis j'essaie de la convertir en un timestamp unix. Voici mon code:erreur d'attribut lors de la tentative de conversion de datetime en timestamp unix en python 2.7

#! /bin/python 
import time, pytz 
from datetime import datetime 

eastern = pytz.timezone("US/Eastern") 

def toUnix(dt): 
    #converts a datetime to a unix timestamp 
    return time.mktime(dt.timetuple()) 

def getFillStartTime(fillNo): 
    #returns the start time of a fill as a unix time stamp 
    dsacursor.execute('select startTime from fillInfo where fillNo = @fillNo',{'@fillNo':fillNo}) 
    sel = dsacursor.fetchall() 
    dt = sel[0][0] 
    dt = dt.replace(tzinfo = eastern) 
    return toUnix(dt) 

print getFillStartTime(20318) 

Quand je le lance, je suis en train de AttributeError: replace ici est le retraçage:

Traceback (most recent call last): 
    File "test.py", line 27, in <module> 
    print getFillStartTime(20318) 
    File "importToLogView.py", line 25, in getFillStartTime 
    dt = dt.replace(tzinfo = eastern) 
AttributeError: replace 

J'ai testé certaines choses et dt de type DateTimeType quand il est passé à la fonction toUnix(). Aussi, quand je remplace dt.timetuple() avec datetime.now().timetuple() il imprime le résultat attendu. J'ai également essayé de ne pas remplacer le tzinfo et il donne AttributeError: timetuple à la place. Si c'est un datetime, pourquoi cette erreur se produit-elle?

+0

double possible de [Conversion en Python timestamp unix] (https://stackoverflow.com/questions/42491129/converting-to-unix-timestamp-python) –

+0

Quelle est la sortie si vous mettre 'type d'impression (dt)' après 'dt = sel [0] [0]'? –

+0

'' –

Répondre

0

Vous supposez que sel sera un objet datetime, mais ce n'est pas le cas. Il n'est pas possible de dériver cela à partir de l'extrait de code que vous avez publié, et il est très probablement renvoyé sous forme de chaîne (client de base de données en fonction). La forme générale de le faire est

dt = datetime.strptime(sel[0][0], '%b %d %Y %I:%M%p')

%b %d %Y %I:%M%p est le format de la chaîne.

EDIT: Mise en forme

+0

si je 'tape type (dt)' après 'dt = sel [0] [0]' la sortie est '' –

+0

Oui, je suppose, parce que votre client de base de données est le plus susceptible de couler cela. Python datetime (et pytz) ne le comprend pas, donc vous devrez l'entrer dans '' ou quelque chose de similaire. De plus, quel client de base de données utilisez-vous? –

+0

Merci, ça l'a corrigé. J'utilise Sybase. –