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?


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

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

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'


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.


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'

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

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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.