J'ai besoin d'extraire les dates d'une série de chaînes comme celle-ci:
for index,row in DF.iterrows(): try: if math.isnan(row['Data_Nasterii']): match = re.search(r'\d{2}.\d{2}.\d{4}', row['Prenume']) date = datetime.strptime(match.group(), '%d.%m.%Y').date() s = datetime.strftime(datetime.strptime(str(date), '%Y-%m-%d'), '%d-%m-%Y') row['Data_Nasterii'] = s except TypeError: pass
ou
'CLAUDIU-MIHAI17.12.1999'
Comment faire cela?
J'ai essayé ceci:
'MIHAI MÄD2Ä3.07.1958'
4 Réponses :
Le .
(point) dans l'expression régulière ne signifie pas le point de caractère, cela signifie «n'importe quoi» et doit être échappé ( \
) pour être un point réel . Autre que cela, votre premier groupe est \ d {2}
, mais certaines de vos dates ont un jour à un chiffre.
J'utiliserais ce qui suit:
''.join(re.search(r'(\d*)(?:[^0-9\.]*)(\d*\.\d+\.\d+)', row['Prenume']).groups())
qui signifie au moins un nombre suivi d'un point suivi d'au moins un nombre .....
si vous avez des personnages mixtes dans votre journée, vous pouvez essayer la solution suivante (sous-par):
re.search(r'(\d+\.\d+\.\d+)', row['Prenume'])
cela filtrera jusqu'à un bloc dans votre "journée", son pas joli mais ça marche (et renvoie une chaîne)
Ensuite, vous pouvez vérifier ma solution.
@Nullman Merci beaucoup! Une seule question. Pour cet exemple: 'MIHAI MĂD2Ă3.07.1958' il faut '3.07.1958' MAIS cela devrait être '23 .07.1958 '. Le chiffre «2» est à l'intérieur du nom
Vous pouvez utiliser l'accesseur str
avec une expression régulière:
DF['Prenume'].str.extract(r'\d{1,2}\.\d{2}\.\d{4}')
Vous devez échapper le point (.)
comme \.
ou vous pouvez l'utiliser dans une classe de caractères - " [.]
". C'est un méta caractère dans regex, qui correspond à n'importe quel caractère. Si vous avez besoin de valider plus de vous pouvez le renvoyer! par exemple: r '[0-9] {2} [.] [0-9] {2} [.] [0-9] {4}' ou r '\ d {2} \. \ d {2} \. \ d {4} '
text = 'CLAUDIU-MIHAI17.12.1999' pattern = r'\d{2}\.\d{2}\.\d{4}' if re.search(pattern, text): print("yes")
Une autre bonne solution pourrait être d'utiliser sortie dateutil.parser
: A userdate
0 MIHAI MÄD2Ä3.07.1958 1958-07-23
1 CLAUDIU-MIHAI17.12.1999 1999-12-17
import pandas as pd
import dateutil.parser as dparser
df = pd.DataFrame({'A': ['MIHAI MÄD2Ä3.07.1958',
'CLAUDIU-MIHAI17.12.1999']})
df['userdate'] = df['A'].apply(lambda x: dparser.parse(x.encode('ascii',errors='ignore'),fuzzy=True))
Je vous remercie! Puis-je appliquer cela sur une seule valeur et non sur une colonne?
Bien sûr. s1 = 'asd 03.12.1999'
, puis print (dparser.parse (s1, fuzzy = True))
et vous obtenez 1999-03-12 00: 00:00
.
qu'avez-vous essayé? avez-vous essayé les expressions régulières?
@Nullman voir ma question modifiée
.
ne signifie pas le point de caractère, cela signifie n'importe quel caractère et doit être échappé. essayez ceci:r '\ d + \. \ d + \. \ d +'