2
votes

Comment analyser la chaîne de temps sans date et chaîne de date sans heure?

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?


0 commentaires

4 Réponses :


2
votes

Vous pouvez utiliser fromisoformat () code> depuis datetime.

import datetime
datetime.time.fromisoformat('23:53')
datetime.date.fromisoformat('2018-01-04')


1 commentaires

Il vaut probablement la peine de mentionner que fromisoformat () n'a pas été ajouté avant Python 3.7.



0
votes

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


0 commentaires

0
votes

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'option fuzzy_with_tokens est True , renvoie un tuple, le premier élément étant un objet 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)


0 commentaires

0
votes

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'


0 commentaires