[PYTHON] Gère divers formats de date avec des pandas

Puisqu'il s'agit de la nouvelle période de survie, je voudrais discuter de la façon d'utiliser les "pandas", en particulier le format de la date. Il existe une réputation selon laquelle "Python est fort dans l'analyse des données", mais cela est réalisé par les packages "standard" suivants.

  • "pandas" for representing and analyzing data
  • "NumPy" for basic numeriacal computation
  • "SciPy" for scientific computation including statistics
  • "StatsModels" for regression and other statistical analysis
  • "matplotlib" for visualization (Ce qui précède est cité dans "Think Stats".)

pandas est un package permettant de manipuler des objets Series (structure de données unidimensionnelle) et des objets DataFrame (structure de données bidimensionnelle), et prend à l'origine en charge les fonctions nécessaires pour gérer les données économiques telles que les cours boursiers. On peut dire que c'est une bibliothèque qui est solide contre les données dites de séries chronologiques.

Cependant, en regardant les données chronologiques qui sont réellement sur le marché, il y a des cas où "2016-03-28" est entré dans la colonne de date au format standard, mais dans certains cas "28-Mar-16" Dans certains cas, il est difficile à gérer. Dans cet article, je voudrais confirmer comment gérer différentes dates.

(L'environnement de programmation est Python 2.7.11 + Jupyter + noyau IPython et Python 3.5.1 + noyau Jupyter + IPython, pandas 0.18.0.)

Convertissez les dates en saisissant autant de données que possible

Ici, on suppose que les données de la série chronologique sont lues comme un fichier CSV (valeurs séparées par des virgules). Dans le travail d'analyse des données de séries chronologiques, je pense que l'heure et la date seront utilisées comme index de la structure des données. Dans les pandas, read_csv () est utilisé comme suit.

Lorsque vous souhaitez saisir le fichier CSV suivant

Date,Open,High,Low,Close
2014/12/31,17702.11914,17713.75977,17450.76953,17450.76953
2014/12/30,17702.11914,17713.75977,17450.76953,17450.76953
2014/12/29,17914.55078,17914.55078,17525.66016,17729.83984
2014/12/26,17778.91016,17843.73047,17769.00977,17818.96094
 . . . 
(Omis)

Avec le code suivant,

df1 = pd.read_csv('./pandas_date_ex/example1.csv', index_col='Date', parse_dates='Date')
df1.head()         # for check

Le contenu entré dans df1 est le suivant. pandas_date_index1.PNG

Le point à confirmer ici est que la "Date" la plus à gauche doit être un type d'horodatage pour traiter la date sous forme de valeur numérique et non de type chaîne de caractères. (Dans le flux des travaux d'analyse, je ne souhaite pas utiliser l'index "chaîne de caractères" lors de l'analyse d'interpolation et de régression.)

>>> type(df1.index[0])
pandas.tslib.Timestamp

Vous pouvez voir que la date est correctement convertie en type Pandas.Timestamp comme indiqué ci-dessus. C'est parce que les options suivantes spécifiées dans read_csv () fonctionnaient correctement.

--index_col = 'Date': utilisez la colonne'Date 'comme index du DataFrame. --parse_dates = 'Date': scannez la colonne 'Date' et convertissez-la en Datetime.

Comme mentionné ci-dessus, le format standard des données de date (ex. «2014-12-31») fonctionnait bien.

Situation de format de date qui semble un peu difficile

Ensuite, gérez le "example2.csv" suivant. Tout d'abord, pour vérifier le contenu, entrez le fichier sans aucune option.

df20 = pd.read_csv('./pandas_date_ex/example2.csv')
df20.head()

pandas_date_index2.PNG

À ce stade, 'Date' n'est pas indexée et le type de variable reste string (str). Comme vous pouvez le voir, cette fois, il semble être un peu difficile à déchiffrer comme '15 -Mar-16 '. Il existe différents formats de date dans le monde, dont cet exemple, il semble donc nécessaire de réfléchir à la manière de les gérer.

Différents cas de notation de date

Maintenant, essayons la méthode utilisée dans "example1.csv" plus haut dans "example2.csv". Je vais changer un peu la façon d'ajouter des options, mais cela ne fait que changer la spécification de la colonne du nom de la colonne ('Date') au numéro de colonne (= 0).

df2 = pd.read_csv('./pandas_date_ex/example2.csv', index_col=0, parse_dates=0)
df2.head()

pandas_date_index3.PNG

J'ai trouvé difficile d'interpréter la date, mais cela a fonctionné de manière inattendue. L'analyseur de date utilisé dans pandas.read_csv () semble assez bon.

En fait, j'ai préparé le code suivant en prévision du cas où la conversion de date ne fonctionne pas. (... Créé en se référant au site Q&R / stackoverflow.)

f2 = '%d-%b-%y'
my_parser = lambda date: pd.datetime.strptime(date, f2)
df21 = pd.read_csv('example2.csv', index_col=0, parse_dates=0, 
                    date_parser=my_parser)

Vous pouvez préparer votre propre analyseur et utiliser read_csv () pour l'utiliser. Mais cette fois, la méthode ci-dessus a fonctionné, donc ce code n'est pas entré en jeu.

Quel est le format de la date, y compris le japonais?

Je ne pense pas qu'il y en ait beaucoup, mais j'aimerais en savoir plus sur les formats de date, y compris le japonais. Essayez la même méthode qu'auparavant.

df31 = pd.read_csv('./pandas_date_ex/example3.csv', index_col='Date', parse_dates='Date')
df31.head()

pandas_date_index4.PNG

Il semble qu'il soit indexé, mais le japonais est inclus dans la colonne Date.

>>> type(df31.index[0])
str

Encore une fois, la colonne "Date" est restée un type chaîne. En d'autres termes, l'option parse_dates spécifiée dans read_csv () ne fonctionne pas. (Il semble que ce n'est pas une spécification qui provoque une exception et interrompt le travail.)

Dans ce cas, vous avez toujours besoin de votre propre analyseur.

f3 = '%Y année%m mois%jour j'
my_parser = lambda date: pd.datetime.strptime(date, f3)
df3 = pd.read_csv('./pandas_date_ex/example3.csv', index_col=0, parse_dates=0, 
                    date_parser=my_parser)
df3.head()

pandas_date_index5.PNG

Ça s'est bien passé. Enfin, traçons (une partie de) ces données.

df3[['High', 'Low']].plot(figsize=(8,4), grid=True)

pandas_date_index6.png

Il ne semble y avoir aucun problème. (La fonction plot de pandas est un wrapper de la bibliothèque matplotlib, elle ressemble donc à la figure ci-dessus.)

Comme mentionné ci-dessus, l'analyseur de date dans read_csv () des pandas semble être capable de gérer une plage assez large. Nous avons également constaté que les cas spéciaux tels que les dates incluant le japonais comme «année» et «mois» peuvent être traités en préparant votre propre analyseur. (En tant qu'application, vous devriez pouvoir convertir l'année avec le yuan japonais en calendrier occidental en écrivant un analyseur.)

De plus, il est nécessaire de spécifier le format de lecture dans le propre analyseur, mais on dit que cela est conforme à la spécification de strftime () en langage C. (Référence: https://docs.python.org/3/library/datetime.html#strftime-and-strptime-behavior)

Pour plus de détails, veuillez consulter le document, et je vais extraire le format de date que vous êtes susceptible d'utiliser. (Le rôle de la directive change selon le cas.)

Directif sens Exemple
%d 0 remplissage(zero padding)La date du mois exprimée en décimal. 01, 02, ..., 31
%b Le nom du mois des paramètres régionaux est affiché sous forme abrégée. Jan, Feb, ..., Dec (en_US); Jan, Feb, ..., Dez (de_DE)
%B Affiche le nom du mois des paramètres régionaux. January, February, ...,
%m Mois en notation décimale avec 0. 01, 02, ..., 12
%y Année avec un siècle (2 chiffres) exprimée en nombres décimaux remplis de 0. 00, 01, ..., 99
%Y UN D(4 chiffres)Représente la notation décimale de. 2011, 2012, 2013, ...

Je suis entré dans un petit détail, mais les pandas sont très polyvalents et sont utilisés dans de nombreux endroits, pas seulement des données chronologiques. Je pense que le flux de travail du prétraitement des données à l'aide de pandas et de la saisie des données formatées dans le cadre de l'apprentissage automatique et du Deep Learning est également courant.

(Avis sur la compréhension des classes liées aux dates)

Voici quelques-unes des classes liées aux dates les plus courantes gérées par Python. --datetime.datetime classe --numpy.datetime64 classe --pandas.Timestamp classe

Avec ma mauvaise compréhension, j'ai écrit cet article en supposant que ces trois classes (en particulier datetime.datetime et pandas.Timestamp) sont presque les mêmes. Mais à proprement parler, ils peuvent ne pas être les mêmes. (Je ne pense pas que cela affectera le comportement du code publié dans l'article, mais s'il y a des erreurs ou des descriptions inexactes, j'aimerais corriger l'article. Si vous avez des suggestions, s'il vous plaît.)

Références (site web)

Recommended Posts

Gère divers formats de date avec des pandas
Gérer les types entiers avec des valeurs manquantes dans Pandas
Visualisez rapidement avec les pandas
Traitement des ensembles de données avec des pandas (1)
Échantillonnage bootstrap avec Pandas
Convertir 202003 en 2020-03 avec les pandas
Fusionner les ensembles de données avec les pandas
Pandas apprenant avec la chimioinfomatique
Gérez Excel avec python
Manipuler rabbimq avec python
Visualisation des données avec les pandas
Manipulation des données avec les Pandas!
Mélangez les données avec les pandas
Obtenez date avec python
Différentes barres de couleurs avec Matplotlib
Ingéniosité pour gérer les données avec Pandas de manière à économiser la mémoire
Lire csv avec des pandas python
Charger json imbriqué avec des pandas
Essayez différentes choses avec PhantomJS
[Python] Changer de type avec les pandas
[Astuces] Gérez Athena avec Python
Ajout d'une seule ligne avec divers scripts
Manipulez diverses bases de données avec Python
Standardisez par groupe avec les pandas
Gérez les tableaux numpy avec f2py
Développé avec Choregraphe et divers mémorandums
Travailler avec des fichiers JSON dans Matlab
Empêchez les omissions avec l'impression de pandas
Conseils de traitement des données avec Pandas