Analyser une Pandas colonne de type Datetime
J'ai un DataFrame
avec colonne nommée date
. Comment peut-on convertir/analyser les 'date' colonne à une DateTime
objet?
J'ai chargé la date de la colonne à partir d'une base de données Postgresql à l'aide de sql.read_frame()
. Un exemple de la date
colonne est 2013-04-04
.
Ce que je suis en train de faire est de sélectionner toutes les lignes dans un dataframe qui a leur date de colonnes à l'intérieur d'une certaine période, comme après 2013-04-01
et avant 2013-04-04
.
Ma tentative ci-dessous donne l'erreur 'Series' object has no attribute 'read'
Tentative
import dateutil
df['date'] = dateutil.parser.parse(df['date'])
Erreur
AttributeError Traceback (most recent call last)
<ipython-input-636-9b19aa5f989c> in <module>()
15
16 # Parse 'Date' Column to Datetime
---> 17 df['date'] = dateutil.parser.parse(df['date'])
18
19 # SELECT RECENT SALES
C:\Python27\lib\site-packages\dateutil\parser.pyc in parse(timestr, parserinfo, **kwargs)
695 return parser(parserinfo).parse(timestr, **kwargs)
696 else:
--> 697 return DEFAULTPARSER.parse(timestr, **kwargs)
698
699
C:\Python27\lib\site-packages\dateutil\parser.pyc in parse(self, timestr, default, ignoretz, tzinfos, **kwargs)
299 default = datetime.datetime.now().replace(hour=0, minute=0,
300 second=0, microsecond=0)
--> 301 res = self._parse(timestr, **kwargs)
302 if res is None:
303 raise ValueError, "unknown string format"
C:\Python27\lib\site-packages\dateutil\parser.pyc in _parse(self, timestr, dayfirst, yearfirst, fuzzy)
347 yearfirst = info.yearfirst
348 res = self._result()
--> 349 l = _timelex.split(timestr)
350 try:
351
C:\Python27\lib\site-packages\dateutil\parser.pyc in split(cls, s)
141
142 def split(cls, s):
--> 143 return list(cls(s))
144 split = classmethod(split)
145
C:\Python27\lib\site-packages\dateutil\parser.pyc in next(self)
135
136 def next(self):
--> 137 token = self.get_token()
138 if token is None:
139 raise StopIteration
C:\Python27\lib\site-packages\dateutil\parser.pyc in get_token(self)
66 nextchar = self.charstack.pop(0)
67 else:
---> 68 nextchar = self.instream.read(1)
69 while nextchar == '\x00':
70 nextchar = self.instream.read(1)
AttributeError: 'Series' object has no attribute 'read'
df['date'].apply(dateutil.parser.parse)
me donne l'erreur AttributeError: 'datetime.date' object has no attribute 'read'
df['date'].truncate(after='2013/04/01')
donne l'erreur TypeError: can't compare datetime.datetime to long
df['date'].dtype
retourne dtype('O')
. Est-il déjà un datetime
objet?
- S'il vous plaît poster un exemple de quelque chose dans votre
date
colonne! Parce que les pandas devraient en fait reconnaître un objet datetime, de sorte qu'il serait utile de voir le format actuel pour cette colonne - J'ai chargé la date de la colonne à partir d'une base de données Postgresql à l'aide de
sql.read_frame()
. Un exemple de ladate
colonne est2013-04-04
. Comment voulez-vous vérifier pour la dtype d'une colonne? df['date'].dtype
retournedtype('O')
Vous devez vous connecter pour publier un commentaire.
pandas déjà se lit comme un
datetime
objet! Donc, ce que vous voulez, c'est de sélectionner des lignes entre deux dates et vous pouvez le faire par masquage:Parce que vous avez dit que vous avez été d'avoir une erreur à partir de la chaîne pour une raison quelconque, essayez ceci:
df = df[df.date > '2012-01-01']
me donne une erreurTypeError: can't compare datetime.date to str
.sql.read_frame
,'2012-01-01'
se fait traiter comme une chaîne de caractères?df[df.date > dateutil.parser.parse('2013-01-01') ]
me donneTypeError: can't compare datetime.datetime to datetime.date
2013-01-01
est traité comme une chaîne. La variation de l'erreur d'avoir unstr
pour avoir undatetime.date
lorsque j'ai utilisédateutil.parser.parse()
comme dans les commentaires ci-dessusPandas est conscient de l'objet datetime, mais lorsque vous utilisez certaines fonctions d'importation il est pris comme une chaîne de caractères. Donc, ce que vous devez faire est de s'assurer que la colonne est définie comme le type datetime pas comme une chaîne de caractères. Ensuite, vous pouvez faire votre requête.
Vous avez probablement besoin de
apply
, donc quelque chose comme:Sans exemple de la colonne, je ne peux pas garantir que cela fonctionne, mais quelque chose dans ce sens devrait vous aider à mener.
df['date'].apply(dateutil.parser.parse)
et il a donné ele d'erreur.AttributeError: 'datetime.date' object has no attribute 'read'
. Un exemple de la colonne est2013-04-04
. L'ensemble du dataframe a été chargé à partir d'une base de données PostgreSQL à l'aide desql.readframe()
.Ne pas confondre
datetime.date
avec les Pandaspd.Timestamp
Un "Pandas
datetime
de la série" contientpd.Timestamp
éléments, pasdatetime.date
éléments. La solution recommandée pour les Pandas:Les réponses les plus fréquentes ont des problèmes:
TypeError
.Tout bon Pandas solution doit assurer:
datetime
de la série, pasobject
dtype.datetime
série est comparée à une compatible objet, par exemplepd.Timestamp
ou chaîne dans le format correct.Voici une démonstration par l'analyse comparative, ce qui démontre que le coût de la conversion peut être immédiatement compensé par une seule opération:
Vous devez effectuer une itération sur les éléments et les analyser de façon indépendante, puis de construire une nouvelle liste.