J'ai une donnée qui ressemble à ceci
AttributeError: 'DatetimeProperties' object has no attribute 'granularity_val'
J'utilise des pandas pour faire du tri de données. Maintenant, j'ai besoin d'obtenir une liste de dates à partir des données dans certains formats comme heure , mois , année etc. Donc pour extraire les dates du données en mois , voici ce que je fais
granularity_val = 'year' dates = df[1].dt.granularity_val.values.tolist()
Je reçois donc une liste de mois. Mais dans la méthode df [1] .dt.year.values.tolist () , je souhaite attribuer la granularité de manière dynamique, c'est-à-dire qu'elle peut être soit dt.month , soit dt.year basé sur la valeur de la variable.
Disons que j'ai une variable appelée granularity_val
Donc si granularity_val = 'year' , je devrais faire
dates = df[1].dt.month.values.tolist()
De même si granularity_val = 'month' , je devrais faire
dates = df[1].dt.year.values.tolist()
J'ai donc essayé de faire quelque chose comme ça
import pandas as pd import datetime df = pd.DataFrame(data) dates = df[1].dt.month.values.tolist()
Mais cela génère une erreur comme ci-dessous
data = [(u'Del', datetime.datetime(2019, 11, 1, 0, 0), 59L), (u'Bom', datetime.datetime(2019, 11, 1, 0, 0), 449L), (u'Del', datetime.datetime(2019, 12, 1, 0, 0), 0L), (u'Bom', datetime.datetime(2019, 12, 1, 0, 0), 45L)]
Je comprends qu'il essaie de traiter la variable comme un attribut de l'objet dt de pandas . Alors, comment faire comprendre à Python qu'il doit traiter granularity_val non pas comme un attribut mais comme une valeur de variable?
4 Réponses :
Vous pouvez utiliser getattr pour référencer n'importe quel attribut par la chaîne
getattr(df[1].dt, granularity_val).values.tolist()
Utilisez getattr pour obtenir et pour les pandas 0.24+ à la place, les valeurs utilisent Series.to_numpy :
granularity_val = 'year' dates = getattr(df[1].dt, granularity_val).to_numpy().tolist() print (dates) [2010, 2010, 2010, 2010, 2010]
df = pd.DataFrame({1: pd.date_range('2010-01-02', periods=5)})
granularity_val = 'month'
dates = getattr(df[1].dt, granularity_val).to_numpy().tolist()
print (dates)
[1, 1, 1, 1, 1]
@SouvikRay donc votre version de pandas est inférieure à 0.24+
Voici une façon d'utiliser strftime :
df = pd.DataFrame({'date': pd.date_range(start='2019-01-01', freq='D', periods=5))
Données
granularity_val = 'year'
match = {'year': '%Y', 'month': '%m', 'day': '%d'}
date = df.date.dt.strftime(match[granularity_val])
print(date)
['01', '01', '01', '01', '01']
Pour un exemple, utilisons la tortue de python.
print({t.color()});
Donc, cela règle notre tortue sur la couleur rouge, et sa bordure sur le bleu. Maintenant, disons plus tard dans le code que nous voudrions la couleur de la tortue. Nous pouvons utiliser ce code.
import turtle
t = turtle.Turtle();
t.color('red','blue');
Dans turtle, cela nous donnera un ensemble très étrange:
set ([('red', 'blue')])
Mais, dans la plupart des autres cas, cela nous donnera de meilleurs commentaires.