Analyser la chaîne de date et modifier le format

115

J'ai une chaîne de date au format «Mon 15 février 2010». Je souhaite changer le format en «15/02/2010». Comment puis-je faire ceci?

Nimmy
la source
Dupliquer tous ces éléments: stackoverflow.com/search?q=%5Bpython%5D+parse+date . Copie exacte de ceci: stackoverflow.com/questions/1713594/…
S.Lott

Réponses:

153

datetime module pourrait vous aider avec cela:

datetime.datetime.strptime(date_string, format1).strftime(format2)

Pour l'exemple spécifique que vous pourriez faire

>>> datetime.datetime.strptime('Mon Feb 15 2010', '%a %b %d %Y').strftime('%d/%m/%Y')
'15/02/2010'
>>>
SilentGhost
la source
2
datetime.datetime (lun 15 février 2010, "% a% b% d% Y"). strftime ("% d /% m /% Y") Est-ce correct? mais j'ai une erreur.
Nimmy
1
@nimmyliji: il a été corrigé 10 minutes avant la publication de votre commentaire. et bien sûr, vous devriez avoir date_stringune chaîne.
SilentGhost
3
un exemple pleinement fonctionnel s'il vous plaît;) quelle importation / ... est nécessaire?
codeling
format1doit être une chaîne pour exprimer le format de la chaîne de date d'entrée. format2est le format de chaîne cible à afficher.
ThorSummoner
1
Pouvez-vous en dire plus, à quoi doit ressembler format1 dans cet exemple?
user1767754
59

Vous pouvez installer la bibliothèque dateutil . Sa parsefonction peut déterminer le format d'une chaîne sans avoir à spécifier le format comme vous le faites avec datetime.strptime.

from dateutil.parser import parse
dt = parse('Mon Feb 15 2010')
print(dt)
# datetime.datetime(2010, 2, 15, 0, 0)
print(dt.strftime('%d/%m/%Y'))
# 15/02/2010
Llazzaro
la source
dateutil.parse est une meilleure alternative si le format exact d'une chaîne ISO légale est inconnu. ISO peut contenir ou non des microsecondes. Il peut contenir ou non un "Z" à la fin. datetime.strptime n'est pas assez flexible pour s'adapter à cela.
Michael Kariv
4
Pase Date doit être utilisé avec précaution. parse ('12 .07.2017 ') renvoie datetime (2017, 12, 7, ..) mais parse ('13 .07.2017') renvoie .datetime (2017, 7, 13, ...)
ego2dot0
Dans les python 3.xbesoins d'installationpython-dateutil pip install python-dateutil
AB Abhi
24
>>> from_date="Mon Feb 15 2010"
>>> import time                
>>> conv=time.strptime(from_date,"%a %b %d %Y")
>>> time.strftime("%d/%m/%Y",conv)
'15/02/2010'
ghostdog74
la source
23

convertir une chaîne en objet datetime

from datetime import datetime
s = "2016-03-26T09:25:55.000Z"
f = "%Y-%m-%dT%H:%M:%S.%fZ"
out = datetime.strptime(s, f)
print(out)
output:
2016-03-26 09:25:55
anjaneyulubatta505
la source
Ce n'est pas conforme au format qu'il a demandé, qui contenait une chaîne de mois "Feb".
Shahir Ansari
@ShahirAnsari vous pouvez changer le format comme vous le souhaitez, reportez-vous à " docs.python.org/3/library/datetime.html "
anjaneyulubatta505
14

Comme cette question revient souvent, voici l'explication simple.

datetimeou timemodule a deux fonctions importantes.

  • strftime - crée une représentation sous forme de chaîne de date ou d'heure à partir d'un objet datetime ou time.
  • strptime - crée un objet datetime ou time à partir d'une chaîne.

Dans les deux cas, nous avons besoin d'une chaîne de formatage. C'est la représentation qui indique comment la date ou l'heure est formatée dans votre chaîne.

Supposons maintenant que nous ayons un objet date.

>>> from datetime import datetime
>>> d = datetime(2010, 2, 15)
>>> d
datetime.datetime(2010, 2, 15, 0, 0)

Si nous voulons créer une chaîne à partir de cette date au format 'Mon Feb 15 2010'

>>> s = d.strftime('%a %b %d %y')
>>> print s
Mon Feb 15 10

Supposons que nous souhaitons le convertir à snouveau en datetimeobjet.

>>> new_date = datetime.strptime(s, '%a %b %d %y')
>>> print new_date
2010-02-15 00:00:00

Reportez-vous à ce document toutes les directives de formatage concernant datetime.

thavan
la source
J'adore votre explication.
enchance le
2

Juste pour être terminé: lors de l'analyse d'une date en utilisant strptime()et la date contient le nom d'un jour, d'un mois, etc., sachez que vous devez tenir compte des paramètres régionaux.

Il est également mentionné en note de bas de page dans la documentation .

Par exemple:

import locale
print(locale.getlocale())

>> ('nl_BE', 'ISO8859-1')

from datetime import datetime
datetime.strptime('6-Mar-2016', '%d-%b-%Y').strftime('%Y-%m-%d')

>> ValueError: time data '6-Mar-2016' does not match format '%d-%b-%Y'

locale.setlocale(locale.LC_ALL, 'en_US')
datetime.strptime('6-Mar-2016', '%d-%b-%Y').strftime('%Y-%m-%d')

>> '2016-03-06'
ƘɌỈSƬƠƑ
la source
2

@codeling et @ user1767754: les deux lignes suivantes fonctionneront. Je n'ai vu personne afficher la solution complète pour l'exemple de problème qui a été demandé. J'espère que c'est une explication suffisante.

import datetime

x = datetime.datetime.strptime("Mon Feb 15 2010", "%a %b %d %Y").strftime("%d/%m/%Y")
print(x)

Production:

15/02/2010
Gobryas
la source
1

Vous pouvez également y parvenir en utilisant des pandas:

import pandas as pd

pd.to_datetime('Mon Feb 15 2010', format='%a %b %d %Y').strftime('%d/%m/%Y')

Production:

'15/02/2010'

Vous pouvez appliquer l'approche pandas pour différents types de données comme:

import pandas as pd
import numpy as np

def reformat_date(date_string, old_format, new_format):
    return pd.to_datetime(date_string, format=old_format, errors='ignore').strftime(new_format)

date_string = 'Mon Feb 15 2010'
date_list = ['Mon Feb 15 2010', 'Wed Feb 17 2010']
date_array = np.array(date_list)
date_series = pd.Series(date_list)

old_format = '%a %b %d %Y'
new_format = '%d/%m/%Y'

print(reformat_date(date_string, old_format, new_format))
print(reformat_date(date_list, old_format, new_format).values)
print(reformat_date(date_array, old_format, new_format).values)
print(date_series.apply(lambda x: reformat_date(x, old_format, new_format)).values)

Production:

15/02/2010
['15/02/2010' '17/02/2010']
['15/02/2010' '17/02/2010']
['15/02/2010' '17/02/2010']
méchant
la source