Cours
En Python, les chaînes de caractères constituent un type de données couramment utilisé pour représenter les dates et les heures. Cependant, en tant que scientifiques et ingénieurs de données, nous sommes souvent amenés à convertir ces chaînes en objets datetime afin d'effectuer diverses opérations, telles que le tri ou la comparaison.
La conversion de chaînes de caractères en objets datetime peut s'avérer délicate, en particulier pour les personnes qui débutent avec Python. Dans cet article, je vais donc vous présenter les étapes nécessaires à l'utilisation de ces méthodes et vous fournir des exemples de code tout au long de la présentation. Que vous soyez un développeur expérimenté ou que vous débutiez, plongeons-nous dans l'univers des objets datetime en Python.
Pour exécuter facilement tous les exemples de code de ce tutoriel, vous pouvez créer gratuitement un classeur DataLab qui comprend Python préinstallé et contient tous les exemples de code. Pour vous exercer davantage à la conversion de chaînes de caractères en objets datetime, veuillez consulter cet exercice pratique sur DataCamp.
Apprenez Python à partir de zéro
Présentation du module datetime de Python
Le module datetime, intégré à Python, peut être utilisé chaque fois que vous avez besoin de travailler avec des dates, des heures ou des intervalles de temps pour toute application développée avec Python. Il fournit des classes et des méthodes pratiques pour représenter et manipuler les données de date et d'heure.
Tableau 1 : Résumé des classes et méthodes du module datetime
| Classe/Méthode | Objectif | Cas d'utilisation courants |
|---|---|---|
datetime.date |
Représente une date (année, mois, jour). | Calculer les différences entre les dates, formater les dates sous forme de chaînes, extraire les composants de date. |
datetime.time |
Représente un moment de la journée (heure, minute, seconde, microseconde). | Comparaison des heures, formatage des heures sous forme de chaînes, extraction des composants temporels. |
datetime.datetime |
Représente une date et une heure. Combine les fonctionnalités de date et d'heure. | Travail avec des données chronologiques, extraction des composants date et heure, formatage sous forme de chaînes de caractères. |
datetime.timedelta |
Représente la différence entre deux dates ou deux heures (durée). | Ajouter ou soustraire des durées à des dates ou des heures, calculer des intervalles de temps. |
datetime.strptime() |
Analyse une chaîne de caractères pour la convertir en un objet datetime selon un format spécifié. | Conversion de chaînes de caractères en objets datetime pour une manipulation et une analyse plus approfondies. |
datetime.strftime() |
Formate un objet date-heure en une chaîne de caractères selon un format spécifié. | Conversion d'objets datetime en chaînes lisibles par l'utilisateur pour l'affichage ou la création de rapports. |
Comprenons les principales classes de ce module, car nous allons les convertir en objets datetime :
1. datetime.date
Cette classe représente une date (année, mois et jour) et fournit des méthodes permettant de manipuler les dates, telles que le calcul de la différence entre deux dates et le formatage des dates sous forme de chaînes.
Supposons que nous disposions d'un ensemble de données contenant les cours quotidiens des actions d'une entreprise. Nous pouvons utiliser la classe date pour extraire les dates de l'ensemble de données et créer un graphique de l'évolution des cours boursiers au fil du temps.
Voici un extrait illustrant l'utilisation de la classe date:
from datetime import date
# create a date object representing March 1, 2023
start_date = date(2023, 3, 1)
# extract information such as the year, month, and day
year = start_date.year
month = start_date.month
day = start_date.day
# get the day of the week (Note: Monday is coded as 0, and Sunday as 6)
weekday = start_date.weekday()
# the date can be formatted as a string if needed
date_str = start_date.strftime('%Y-%m-%d')
2. datetime.time
Cette classe représente une heure de la journée (heure, minute, seconde et microseconde) et fournit des méthodes permettant de manipuler les heures, par exemple pour les comparer ou les formater sous forme de chaînes.
Supposons que nous disposions d'un ensemble de données contenant l'heure d'arrivée d'une course ; nous pouvons utiliser la classe time pour extraire les heures et les minutes de chaque concurrent ayant terminé la course.
from datetime import time
# create a time object with the microsecond granularity
end_time = time(15, 45, 30, 500000)
# get the hour and minute
hour = end_time.hour
minute = end_time.minute
second = end_time.second
microsecond = end_time.microsecond
3. datetime.datetime
Cette classe représente une date et une heure et fournit des méthodes permettant de les manipuler. Il combine les fonctionnalités des classes date et heure.
Il est couramment utilisé dans les tâches d'analyse de données impliquant des données chronologiques à haute résolution temporelle, telles que les données horaires ou minutées. Supposons que nous disposions d'un ensemble de données contenant la demande horaire en électricité d'une ville. Nous pouvons utiliser la classe datetime pour extraire la date et l'heure de l'ensemble de données et créer un graphique de la demande en électricité au fil du temps.
from datetime import datetime
# create a datetime object representing March 1, 2023 at 9:30 AM
start_datetime = datetime(2023, 3, 1, 9, 30)
# get the year, month, day, hour, and minute
year = start_datetime.year
month = start_datetime.month
day = start_datetime.day
hour = start_datetime.hour
minute = start_datetime.minute
4. datetime.timedelta
Cette classe représente une durée ou un intervalle de temps et fournit des méthodes permettant de manipuler des intervalles de temps, par exemple pour ajouter ou soustraire des intervalles de temps à des dates ou des heures.
Supposons que nous disposions d'un ensemble de données contenant les heures de début et de fin d'une série d'événements et que nous souhaitions calculer la durée totale de tous ces événements. Nous pouvons utiliser la classe timedelta pour calculer la durée de chaque événement et les additionner.
from datetime import timedelta
# create a timedelta object representing 3 hours and 15 minutes
event_duration = timedelta(hours=3, minutes=15)
# get the total duration in seconds
event_duration_seconds = event_duration.total_seconds()
# add the duration to a start time to get an end time
event_start_time = datetime(2023, 3, 1, 18, 15)
event_end_time = event_start_time + event_duration
Dans tous les cas présentés, nous avons utilisé des objets d'datetime, mais dans la pratique, les données réelles restent souvent sous forme de chaîne. La conversion en un objet datetime permet d'accéder à toutes les fonctionnalités susmentionnées, qui sont très utiles dans le cadre de l'analyse et des applications en science des données.
Utilisation de datetime.strptime() pour la conversion de dates et heures
En Python, nous pouvons utiliser la méthode datetime.strptime() pour convertir une chaîne de caractères en objet datetime. La méthode ` strptime() ` prend deux arguments : la chaîne à convertir et une chaîne de format spécifiant le format de la chaîne d'entrée.
La chaîne de format utilise une combinaison de codes de formatage pour représenter les différents composants de la date et de l'heure. Voici quelques-uns des codes de formatage les plus couramment utilisés :
Tableau 2 : Codes courants de formatage de la date et de l'heure
| Code de format | Description | Exemple d'entrée | Exemple de résultat |
|---|---|---|---|
| %Y | Année à 4 chiffres | 2023 | 2023 |
| %y | Année à deux chiffres | 23 | 23 |
| %m | Mois à deux chiffres (01-12) | 03 | 03 |
| %d | Jour du mois à deux chiffres (01-31) | 15 | 15 |
| %H | Heure à 2 chiffres (00-23) | 14 | 14 |
| %I | Heure à deux chiffres (01-12) | 02 | 02 |
| %M | Minutes à deux chiffres (00-59) | 45 | 45 |
| %S | Secondes à deux chiffres (00-59) | 30 | 30 |
| %f | Microseconde (000000-999999) | 123456 | 123456 |
| %p | le matin ou l'après-midi | PM | PM |
| %z | Décalage UTC | +0530 | +0530 |
| %a | Nom abrégé du jour de la semaine | Mardi | Mardi |
| %A | Nom complet du jour de la semaine | mardi | mardi |
| %b | Nom abrégé du mois | Mar | Mar |
| %B | Nom complet du mois | Mars | Mars |
| %j | Jour de l'année (001-366) | 074 | 074 |
| %U | Numéro de la semaine de l'année (le dimanche étant le premier jour) | 10 | 10 |
| %W | Numéro de la semaine de l'année (le lundi étant le premier jour) | 09 | 09 |
Maintenant que nous comprenons les directives d'strptime, le processus de conversion des chaînes de caractères en objets datetime peut être simplifié.
-
Étape 01: Veuillez analyser la chaîne date-heure pouvant être convertie pour les modèles correspondant aux codes de formatage.
-
Étape 02: Veuillez créer le format date-heure à partir des directives de l'
strptime(). -
Étape 03: Transmettez la chaîne et le format à la fonction et recevez l'objet en sortie.
Mettons ces étapes en pratique.
Convertir une chaîne dans un format spécifique en un objet datetime
from datetime import datetime
# Example with the standard date and time format
date_str = '2023-02-28 14:30:00'
date_format = '%Y-%m-%d %H:%M:%S'
date_obj = datetime.strptime(date_str, date_format)
print(date_obj)
# Example with a different format
date_str = '02/28/2023 02:30 PM'
date_format = '%m/%d/%Y %I:%M %p'
date_obj = datetime.strptime(date_str, date_format)
print(date_obj)
Dans le premier exemple, nous avons une chaîne représentant une date et une heure au format « AAAA-MM-JJ HH:MM:SS », et dans le second exemple, au format différent « MM/JJ/AAAA HH:MM AM/PM ».
Dans les deux cas, après avoir spécifié la chaîne de format correcte comme deuxième argument à strptime(), nous obtenons l'objet datetime correct.
Convertir une chaîne contenant des informations de fuseau horaire en un objet datetime
from datetime import datetime
date_str = '2023-02-28 14:30:00+05:30'
date_format = '%Y-%m-%d %H:%M:%S%z'
date_obj = datetime.strptime(date_str, date_format)
print(date_obj)
Dans cet exemple, nous avons une chaîne représentant une date et une heure avec des informations de fuseau horaire au format « AAAA-MM-JJ HH:MM:SS+TZOFFSET », où TZOFFSET correspond au décalage horaire en heures et minutes par rapport à l'UTC. Nous spécifions la chaîne de format comme deuxième argument de la fonction ` strptime()`, en incluant le code de formatage ` %z ` pour analyser le décalage horaire.
Bien que la fonction que nous avons vue ci-dessus puisse sembler simple en théorie, elle peut également être source de frustration lorsque les choses ne se déroulent pas comme prévu dans la pratique.
Analyse des dates sans chaînes de format à l'aide de dateutil
Une autre option flexible est la bibliothèque dateutil, en particulier la fonction parser.parse(). Il détecte automatiquement les formats de date, ce qui vous permet d'analyser des chaînes sans spécifier de chaîne de format.
from dateutil.parser import parse
# Automatically infers the format
date_obj = parse("March 1, 2023 9:30 AM")
print(date_obj)
Ceci est particulièrement utile lorsque l'on traite des formats de date imprévisibles ou incohérents.
Gestion des fuseaux horaires
Pour la gestion des dates et heures tenant compte du fuseau horaire, Python propose deux options courantes :
-
pytz(largement utilisé et compatible avec les versions antérieures) -
zoneinfo(introduit dans Python 3.9, partie intégrante de la bibliothèque standard)
from datetime import datetime
from zoneinfo import ZoneInfo
# Using zoneinfo
dt = datetime(2023, 3, 1, 9, 30, tzinfo=ZoneInfo("America/New_York"))
print(dt)
# Using pytz (alternative)
import pytz
dt_pytz = datetime(2023, 3, 1, 9, 30, tzinfo=pytz.timezone("America/New_York"))
print(dt_pytz)
Ces outils vous permettent d'attribuer des fuseaux horaires, de les convertir et de prendre en compte automatiquement l'heure d'été.
Considérations relatives à l'heure d'été
Lorsque l'on travaille avec des dates et heures tenant compte du fuseau horaire, le passage à l'heure d'été peut entraîner des complications, en particulier lorsque les horloges avancent ou reculent.
Les bibliothèques telles que zoneinfo et pytz gèrent automatiquement les transitions DST lorsque vous attribuez le fuseau horaire approprié :
from datetime import datetime
from zoneinfo import ZoneInfo
# Before and after DST starts
before_dst = datetime(2023, 3, 12, 1, 30, tzinfo=ZoneInfo("America/New_York"))
after_dst = datetime(2023, 3, 12, 3, 30, tzinfo=ZoneInfo("America/New_York"))
print(before_dst)
print(after_dst)
Cela garantit que les calculs de date et d'heure restent précis malgré les changements d'heure d'été.
Utilisation de pandas pour la conversion de dates et heures
Bien que le module intégré datetime de Python soit performant, de nombreux scientifiques des données préfèrent utiliser la bibliothèque pandas pour les conversions de dates et heures en raison de sa simplicité et de sa capacité à traiter efficacement des colonnes entières de dates.
import pandas as pd
# Converting a column of strings to datetime objects
date_series = pd.to_datetime(['2023-02-28', '2023-03-01', '2023-03-02'])
print(date_series)
Pandas détermine automatiquement les formats et gère efficacement les incohérences courantes, ce qui en fait un choix incontournable pour le traitement des données tabulaires.
Formatage d'objets datetime en chaînes de caractères avec strftime()
Une fois que vous avez converti les chaînes en objets datetime et effectué les opérations souhaitées, il se peut que vous deviez les reconvertir en chaînes. Vous pouvez utiliser datetime.strftime() à cette fin.
from datetime import datetime
now = datetime.now()
formatted = now.strftime('%Y-%m-%d %H:%M:%S')
print(formatted)
Cette méthode vous permet de contrôler entièrement la manière dont votre objet datetime est affiché sous forme de chaîne.
Dépannage des erreurs courantes de strptime()
Voici quelques erreurs courantes que vous pourriez rencontrer et comment les résoudre :
Erreur de valeur : les données temporelles « date_string » ne correspondent pas au format « %Y-%m-%d %H:%M:%S ».
L'erreur la plus courante se produit lorsque la chaîne d'entrée ne correspond pas à la chaîne de format. Veuillez vérifier que la chaîne de caractères saisie et la chaîne de format correspondent parfaitement.
import datetime
# When input has two-digit year instead of four-digit year
date_str = '23-03-01'
date_obj = datetime.datetime.strptime(date_str, '%y-%m-%d')
# Raises ValueError: time data '23-03-01' does not match format '%y-%m-%d'
# When the input has missing leading zeros for hour and minute
time_str = '8:30'
time_obj = datetime.datetime.strptime(time_str, '%H:%M')
# Raises ValueError: time data '8:30' does not match format '%H:%M'
Erreur de type : l'argument 1 de strptime() doit être de type str, et non « int ».
L'erreur courante suivante se produit lorsque vous transmettez un entier à datetime.strptime() ou time.strptime() au lieu d'une chaîne de caractères. Veuillez vous assurer que toutes les valeurs que vous transmettez à la fonction sont des chaînes de caractères.
# Example 1: Integer instead of string
date_int = 20230301
date_obj = datetime.datetime.strptime(date_int, '%Y%m%d')
# Raises TypeError: strptime() argument 1 must be str, not int
# Example 2: List instead of string
date_list = [2023, 3, 1]
date_obj = datetime.datetime.strptime(date_list, '%Y-%m-%d')
# Raises TypeError: strptime() argument 1 must be str, not list
ValueError : des données non converties subsistent : « :00 »
Cette erreur se produit lorsque des caractères restants existent dans la chaîne d'entrée, qui ne correspondent pas à la chaîne de format. Par exemple, cette erreur se produira si la chaîne de format ne spécifie que l'année, le mois et le jour, mais que la chaîne d'entrée contient également l'heure. Pour résoudre cette erreur, veuillez vous assurer que la chaîne de format correspond à l'intégralité de la chaîne d'entrée.
# when input string contains time of day
date_str = '2023-03-01 12:30:00'
date_obj = datetime.datetime.strptime(date_str, '%Y-%m-%d')
# Raises ValueError: unconverted data remains: 12:30:00
# When input string contains extra characters
date_str = '2023-03-01T00:00:00Z'
date_obj = datetime.datetime.strptime(date_str, '%Y-%m-%d')
# Raises ValueError: unconverted data remains: T00:00:00Z
Conclusion
On peut affirmer sans risque que la méthode ` datetime.strptime() ` offre un moyen flexible et puissant de convertir des chaînes de caractères en objets datetime en Python et qu'elle peut être utilisée pour traiter un large éventail de formats de date et d'heure. Pourquoi ne pas télécharger notre aide-mémoire Dates et heures pour référence ultérieure ?
Une fois que vous avez bien compris les dates et les heures, l'étape suivante consiste à les mettre en pratique dans le cadre d'un projet. Nous vous recommandons de choisir l'une de ces options et de consolider vos acquis :
Nous reconnaissons que les données de date et d'heure dans le monde réel sont complexes, mais il est suffisant de comprendre les formats et les modèles qui sous-tendent chaque type de date et d'heure dans vos données et d'utiliser judicieusement les bibliothèques dont vous disposez.
Questions fréquentes
Comment puis-je traiter des chaînes contenant des formats de date mixtes dans le même ensemble de données ?
Lorsque vous travaillez avec des ensembles de données qui incluent des formats de date mixtes, vous pouvez utiliser le module dateutil de Python. La fonction dateutil.parser.parse() est plus flexible que datetime.strptime() car elle peut détecter et analyser automatiquement divers formats de date sans nécessiter de chaîne de format prédéfinie :
from dateutil.parser import parse
date_str1 = '2023-03-01'
date_str2 = 'March 1, 2023'
date_obj1 = parse(date_str1)
date_obj2 = parse(date_str2)
print(date_obj1) # Output: 2023-03-01 00:00:00
print(date_obj2) # Output: 2023-03-01 00:00:00Est-il possible de convertir des chaînes de caractères en objets datetime tout en tenant compte des différents fuseaux horaires ?
Oui, vous pouvez gérer les fuseaux horaires en utilisant la bibliothèque pytz en combinaison avec datetime. Tout d'abord, veuillez convertir la chaîne en objet datetime, puis attribuer un fuseau horaire à l'aide de pytz.timezone():
from datetime import datetime
import pytz
date_str = '2023-03-01 14:30:00'
date_format = '%Y-%m-%d %H:%M:%S'
date_obj = datetime.strptime(date_str, date_format)
# Set time zone
timezone = pytz.timezone('US/Eastern')
date_obj_tz = timezone.localize(date_obj)
print(date_obj_tz) # Output: 2023-03-01 14:30:00-05:00Quelle est la différence entre datetime.strptime() et datetime.fromisoformat() ?
datetime.strptime() vous permet de spécifier une chaîne de format personnalisée pour analyser des formats de date non standard ou variés.
datetime.fromisoformat() est spécialement conçu pour analyser les chaînes de date au format ISO 8601 (par exemple, « 2023-03-01T14:30:00 »). Il est plus simple à utiliser si vos chaînes respectent strictement la norme ISO 8601 :
from datetime import datetime
iso_date_str = '2023-03-01T14:30:00'
date_obj = datetime.fromisoformat(iso_date_str)
print(date_obj) # Output: 2023-03-01 14:30:00
En tant que data scientist senior, je conçois, développe et déploie des solutions d'apprentissage automatique à grande échelle pour aider les entreprises à prendre de meilleures décisions basées sur les données. En tant que rédacteur spécialisé dans la science des données, je partage mes apprentissages, mes conseils de carrière et des tutoriels pratiques approfondis.
