web-dev-qa-db-fra.com

python format strptime avec bits optionnels

En ce moment, j'ai:

timestamp = datetime.strptime(date_string, '%Y-%m-%d %H:%M:%S.%f')

Cela fonctionne très bien sauf si je convertis une chaîne qui n'a pas les microsecondes. Comment puis-je spécifier que les microsecondes sont facultatives (et doivent être considérées comme 0 si elles ne sont pas dans la chaîne)?

39

Vous pouvez utiliser un try/except bloquer:

try:
    timestamp = datetime.strptime(date_string, '%Y-%m-%d %H:%M:%S.%f')
except ValueError:
    timestamp = datetime.strptime(date_string, '%Y-%m-%d %H:%M:%S')
41
Alexander

Qu'en est-il simplement de l'ajouter s'il n'existe pas?

if '.' not in date_string:
    date_string = date_string + '.0'

timestamp = datetime.strptime(date_string, '%Y-%m-%d %H:%M:%S.%f')
16
stevieb

Je préfère utiliser des correspondances d'expression régulière au lieu d'essayer et d'exclure. Cela permet de nombreuses solutions de rechange de formats acceptables.

# full timestamp with milliseconds
match = re.match(r"\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d+Z", date_string)
if match:
    return datetime.strptime(date_string, "%Y-%m-%dT%H:%M:%S.%fZ")

# timestamp missing milliseconds
match = re.match(r"\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}Z", date_string)
if match:
    return datetime.strptime(date_string, "%Y-%m-%dT%H:%M:%SZ")

# timestamp missing milliseconds & seconds
match = re.match(r"\d{4}-\d{2}-\d{2}T\d{2}:\d{2}Z", date_string)
if match:
    return datetime.strptime(date_string, "%Y-%m-%dT%H:%MZ")

# unknown timestamp format
return false

N'oubliez pas d'importer "re" ainsi que "datetime" pour cette méthode.

2
fourfightingfoxes
datetime(*map(int, re.findall('\d+', date_string)))

peut analyser à la fois '%Y-%m-%d %H:%M:%S.%f' et '%Y-%m-%d %H:%M:%S'. C'est trop permissif si votre entrée n'est pas filtrée.

C'est rapide et sale mais parfois strptime() est trop lent. Il peut être utilisé si vous savez que l'entrée a le format de date attendu.

1
jfs

Pour mon problème similaire en utilisant jq j'ai utilisé ce qui suit:

|split("Z")[0]|split(".")[0]|strptime("%Y-%m-%dT%H:%M:%S")|mktime

Comme la solution pour trier correctement ma liste par le temps.

0
DC Martin