web-dev-qa-db-fra.com

Pandas: heure de retour depuis la colonne de date / heure directement

Supposons que j'ai un DataFrame sales de valeurs d'horodatage:

timestamp               sales_office
2014-01-01 09:01:00     Cincinnati
2014-01-01 09:11:00     San Francisco
2014-01-01 15:22:00     Chicago
2014-01-01 19:01:00     Chicago

Je voudrais créer une nouvelle colonne time_hour. Je peux le créer en écrivant une fonction courte ainsi et en utilisant apply() pour l'appliquer de manière itérative:

def hr_func(ts):
    return ts.hour

sales['time_hour'] = sales['timestamp'].apply(hr_func)

Je verrais alors ce résultat:

timestamp               sales_office         time_hour
2014-01-01 09:01:00     Cincinnati           9
2014-01-01 09:11:00     San Francisco        9
2014-01-01 15:22:00     Chicago              15
2014-01-01 19:01:00     Chicago              19

Ce que je voudrais accomplir est une transformation plus courte comme celle-ci (ce qui, je le sais, est erroné mais qui va à l’esprit):

sales['time_hour'] = sales['timestamp'].hour

De toute évidence, la colonne est de type Series et, en tant que telle, n’a pas ces attributs, mais il semble qu’il existe un moyen plus simple d’utiliser les opérations de la matrice.

Existe-t-il une approche plus directe?

36
Daniel Black

En supposant que l’horodatage soit l’index de la trame de données, vous pouvez simplement faire

    hours = sales.index.hour

Si vous souhaitez ajouter cela à votre base de données de vente, il suffit de faire

    import pandas as pd
    pd.concat([sales, pd.DataFrame(hours, index=sales.index)], axis = 1)

Edit: Si vous avez plusieurs colonnes d'objets datetime, c'est le même processus. Si vous avez une colonne ['date'] dans votre cadre de données, et en supposant que cette date comporte des valeurs datetime, vous pouvez accéder à l'heure à partir de la 'date' en tant que:

    hours = sales['date'].hour
24
Sudipta Basak

Pour la postérité: à partir de .15. , il existe un outil pratique accesseur .dt que vous pouvez utiliser pour extraire ces valeurs d’une série datetime/period (dans le cas ci-dessus, sales.timestamp.dt.hour!

37
iff_or

Vous pouvez utiliser un expression lambda , par exemple:

sales['time_hour'] = sales.timestamp.apply(lambda x: x.hour)
11
Bob Hannon

Vous pouvez essayer ceci:

sales['time_hour'] = pd.to_datetime(sales['timestamp']).dt.hour
4
TCO