Je lis les données d'un fichier texte avec plus de 14 000 lignes et il y a une colonne qui contient huit (08) chiffres. Le format de certaines lignes est le suivant:

  • 01021943
  • 02031944
  • 00041945
  • 00001946

Le problème est que lorsque j'utilise la fonction to_date, il convertit le type de données de la date de l'objet en int64 mais je veux que ce soit datetime. Deuxièmement, en utilisant la fonction to_datetime, les dates comme

  • 00041945 devient 41945
  • 00001946 devient 1946 et donc je ne peux pas les formater correctement
0
Baig 9 août 2016 à 15:43

3 réponses

Meilleure réponse

Vous pouvez ajouter le paramètre dtype à {{X1} } pour convertir la colonne col en string, puis utilisez to_datetime avec les paramètres format pour spécifier la mise en forme et errors='coerce' - car de mauvaises dates, qui sont converties en NaT:

import pandas as pd
import io

temp=u"""col
01021943
02031944
00041945
00001946"""
#after testing replace io.StringIO(temp) to filename
df = pd.read_csv(io.StringIO(temp), dtype={'col': 'str'})

df['col'] = pd.to_datetime(df['col'], format='%d%m%Y', errors='coerce')

print (df)
         col
0 1943-02-01
1 1944-03-02
2        NaT
3        NaT

print (df.dtypes)
col    datetime64[ns]
dtype: object

Merci Jon Clements pour une autre solution:

import pandas as pd
import io

temp=u"""col_name
01021943
02031944
00041945
00001946"""
#after testing replace io.StringIO(temp) to filename
df = pd.read_csv(io.StringIO(temp), 
                 converters={'col_name': lambda dt: pd.to_datetime(dt, format='%d%m%Y', errors='coerce')})

print (df)
    col_name
0 1943-02-01
1 1944-03-02
2        NaT
3        NaT

print (df.dtypes)
col_name    datetime64[ns]
dtype: object
3
Community 23 mai 2017 à 12:14
import datetime

def to_date(num_str):
    return datetime.datetime.strptime(num_str,"%d%m%Y")

Notez que cela lèvera également des exceptions pour les valeurs nulles car le comportement attendu n'est pas clair pour cette entrée.
Si vous souhaitez un comportement différent pour les valeurs nulles, vous pouvez l'implémenter avec try & except,
par exemple, si vous voulez obtenir None pour des valeurs nulles, vous pouvez faire:

def to_date(num_str):
    try:
        return datetime.datetime.strptime(num_str,"%d%m%Y")
    except ValueError, e:
        return None
1
Elisha 9 août 2016 à 14:30

Comme première solution, vous pouvez simplement l'analyser en tant que chaîne dans une instance datetime. Quelque chose comme:

from datetime import datetime

EXAMPLE = u'01021943'

dt = datetime(int(EXAMPLE[4:]), int(EXAMPLE[2:4]), int(EXAMPLE[:2]))

... ne se soucie pas beaucoup des problèmes de performances.

1
steppo 9 août 2016 à 12:57