Existe-t-il un moyen d'analyser automatiquement les chaînes avec l'heure uniquement pour l'objet datetime.time
(ou quelque chose de similaire)? Idem pour datetime.date
.
J'ai essayé dateutil a>, flèche , moment , pandas .to_datetime . Tous ces analyseurs créent des horodatages avec une date actuelle.
>>> from dateutil.parser import parse >>> parse('23:53') datetime.datetime(2019, 1, 8, 23, 53) # datetime.time(23, 53) expected >>> parse('2018-01-04') datetime.datetime(2018, 1, 4, 0, 0) # datetime.date(2018, 1, 4) expected
UPD:
Merci pour les réponses. Pensez que je devrais clarifier le problème.
Le programme ne sait pas ce qui sera dans l'entrée ( horodatage
, date
ou heure
), et il devrait décider de définir le type approprié. Le problème est de distinguer ces types.
Par exemple, je peux analyser 23:53
et obtenir un horodatage. Comment puis-je décider d'en extraire l'heure ou non?
4 Réponses :
Vous pouvez utiliser fromisoformat () code>
depuis datetime
.
import datetime datetime.time.fromisoformat('23:53') datetime.date.fromisoformat('2018-01-04')
Il vaut probablement la peine de mentionner que fromisoformat ()
n'a pas été ajouté avant Python 3.7.
Voici un exemple. Définissez simplement les attributs de date avec replace et sélectionnez la sortie avec strftime.
import datetime date = datetime.datetime.now() newdate = date.replace(hour=11, minute=59) print(newdate.strftime('%H:%M')) newdate2 = date.replace(year=2014, month=1, day=3) print(newdate2.strftime('%Y-%m-%d'))
Ce que vous voulez fondamentalement, c'est que «23: 53» devienne un objet datetime.time
et que «2018-01-04» devienne un datetime.date
objet. Cela ne peut pas être réalisé en utilisant dateutil.parser.parse ()
:
Renvoie un objet
datetime.datetime
ou, si l'optionfuzzy_with_tokens
estTrue
, renvoie un tuple, le premier élément étant unobjet datetime.datetime
, le second un tuple contenant les jetons flous.
De la documentation . Ainsi, vous obtiendrez toujours un objet datetime.datetime lorsque vous utiliserez dateutil.parser.parse()
Je suppose que vous devez interpréter vous-même la chaîne d'entrée pour définir si vous ' essayez d'analyser une heure ou une date. Lorsque vous faites cela, vous pouvez toujours utiliser la fonction dateutil.parser.parse ()
pour obtenir l'objet souhaité:
from dateutil.parser import parse my_time = parse('23:53') my_time.time() # datetime.time(23, 53) my_time.date() # datetime.date(2019, 1, 8)
Vous pouvez utiliser des modules time ou datetime, mais une chose à garder à l'esprit est que ceux-ci créent toujours un objet, qui spécifie un moment dans le temps. (De plus, si vous analysez des chaînes, envisagez d'utiliser la fonction strptime et de l'afficher sous forme de chaîne, fonction strftime respectivement)
par exemple
try: time.strptime(t_string, "%H:%M") except ValueError: time.strptime(t_string, "%Y-%m-%d")
Non recommandé, mais si vous souhaitez les séparer deux objets pour une raison quelconque et que vous souhaitez ne vous occuper que d'une partie spécifique de votre mission, vous pouvez toujours adresser les numéros respectifs avec
>>> complete_time = time.strptime(complete_t_string, "%Y-%m-%d %H:%M") >>> complete_time time.struct_time(tm_year=2018, tm_mon=1, tm_mday=4, tm_hour=22, tm_min=45, tm_sec=0, tm_wday=3, tm_yday=4, tm_isdst=-1)
Une bien meilleure approche, à mon avis, serait formater la chaîne de date complète et utiliser le strptime pour former un horodatage complet - même si vous obtenez l'heure et la date comme entrées séparées:
>>> complete_t_string = "{} {}".format(dday, ttime) >>> complete_t_string '2018-01-04 22:45'
Vous pouvez utiliser le formateur%, ou les "nouvelles" f-Strings python
>>> ttime = "22:45" >>> dday = "2018-01-04"
Maintenant que nous avons une chaîne complète, nous pouvons spécifier comment elle doit être lue et créer un horodatage complet:
>>> hours.tm_hour 23 >>> hours.tm_min 59 >>> days.tm_mon 1 >>> days.tm_mday 4 >>> days.tm_year 2018
MODIFIER: Quelqu'un va probablement me tuer, mais si vous savez absolument que vous n'obtiendrez que deux types de valeurs, vous pouvez simplement faire une simple construction try / except. Il peut probablement être écrit plus Pythoniquement:
>>> hours = time.strptime("23:59", "%H:%M") >>> days = time.strptime("2018-01-04", "%Y-%m-%d") >>> time.strftime("%H:%M", hours) '23:59' >>> time.strftime("%H:%M %Y", hours) '23:59 1900'