web-dev-qa-db-fra.com

Extraire la date d'une chaîne en Python

Comment puis-je extraire la date d'une chaîne comme "singe 2010-07-10 love banana"? Merci!

62
dmpop

Si la date est donnée sous une forme fixe, vous pouvez simplement utiliser une expression régulière pour extraire la date et "datetime.datetime.strptime" pour analyser la date:

match = re.search(r'\d{4}-\d{2}-\d{2}', text)
date = datetime.strptime(match.group(), '%Y-%m-%d').date()

Sinon, si la date est donnée sous une forme arbitraire, vous ne pouvez pas l'extraire facilement.

57
lunaryorn

En utilisant python-dateutil :

In [1]: import dateutil.parser as dparser

In [18]: dparser.parse("monkey 2010-07-10 love banana",fuzzy=True)
Out[18]: datetime.datetime(2010, 7, 10, 0, 0)

Les dates non valides génèrent un ValueError:

In [19]: dparser.parse("monkey 2010-07-32 love banana",fuzzy=True)
# ValueError: day is out of range for month

Il peut reconnaître des dates dans de nombreux formats:

In [20]: dparser.parse("monkey 20/01/1980 love banana",fuzzy=True)
Out[20]: datetime.datetime(1980, 1, 20, 0, 0)

Notez qu'il fait une supposition si la date est ambiguë:

In [23]: dparser.parse("monkey 10/01/1980 love banana",fuzzy=True)
Out[23]: datetime.datetime(1980, 10, 1, 0, 0)

Mais la façon dont il analyse les dates ambiguës est personnalisable:

In [21]: dparser.parse("monkey 10/01/1980 love banana",fuzzy=True, dayfirst=True)
Out[21]: datetime.datetime(1980, 1, 10, 0, 0)
129
unutbu

Pour extraire la date d'une chaîne en Python; le meilleur module disponible est le module datefinder .

Vous pouvez l'utiliser dans votre projet Python en suivant les étapes simples indiquées ci-dessous.

Étape 1: installer le package datefinder

pip install datefinder

Étape 2: utilisez-le dans votre projet

import datefinder

input_string = "monkey 2010-07-10 love banana"
# a generator will be returned by the datefinder module. I'm typecasting it to a list. Please read the note of caution provided at the bottom.
matches = list(datefinder.find_dates(input_string))

if len(matches) > 0:
    # date returned will be a datetime.datetime object. here we are only using the first match.
    date = matches[0]
    print date
else:
    print 'No dates found'

remarque: si vous attendez un grand nombre de correspondances; puis le transtypage vers la liste ne sera pas une méthode recommandée car il y aura une surcharge de performances importante.

16
Finny Abraham

À l'aide de Pygrok, vous pouvez définir des extensions abstraites de la syntaxe des expressions régulières.

Les motifs personnalisés peuvent être inclus dans votre expression régulière au format %{PATTERN_NAME}.

Vous pouvez également créer une étiquette pour ce modèle, en les séparant par deux points: %s{PATTERN_NAME:matched_string}. Si le modèle correspond, la valeur sera retournée dans le cadre du dictionnaire résultant (par exemple result.get('matched_string'))

Par exemple:

from pygrok import Grok

input_string = 'monkey 2010-07-10 love banana'
date_pattern = '%{YEAR:year}-%{MONTHNUM:month}-%{MONTHDAY:day}'

grok = Grok(date_pattern)
print(grok.match(input_string))

La valeur résultante sera un dictionnaire:

{'month': '07', 'day': '10', 'year': '2010'}

Si le motif de date n'existe pas dans la chaîne d'entrée, la valeur de retour sera None. En revanche, si votre modèle n'a pas d'étiquette, il renverra un dictionnaire vide {}

Les références:

1
Aubrey Lavigne