0
votes

Comment accéder dynamiquement à un attribut d'un objet en Python?

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?


0 commentaires

4 Réponses :


2
votes

Vous pouvez utiliser getattr pour référencer n'importe quel attribut par la chaîne

getattr(df[1].dt, granularity_val).values.tolist()


0 commentaires

2
votes

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]


1 commentaires

@SouvikRay donc votre version de pandas est inférieure à 0.24+



1
votes

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']


0 commentaires

0
votes

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.


0 commentaires