Convertir l'heure Unix en date lisible dans Pandas Dataframe

110

J'ai un dataframe avec des temps et des prix Unix dedans. Je souhaite convertir la colonne d'index pour qu'elle s'affiche en dates lisibles par l'homme.

Donc, par exemple, j'ai datecomme 1349633705dans la colonne d'index mais je voudrais qu'il s'affiche comme 10/07/2012(ou au moins 10/07/2012 18:15).

Pour un certain contexte, voici le code avec lequel je travaille et ce que j'ai déjà essayé:

import json
import urllib2
from datetime import datetime
response = urllib2.urlopen('http://blockchain.info/charts/market-price?&format=json')
data = json.load(response)   
df = DataFrame(data['values'])
df.columns = ["date","price"]
#convert dates 
df.date = df.date.apply(lambda d: datetime.strptime(d, "%Y-%m-%d"))
df.index = df.date   

Comme vous pouvez le voir, j'utilise df.date = df.date.apply(lambda d: datetime.strptime(d, "%Y-%m-%d"))ici ce qui ne fonctionne pas car je travaille avec des entiers, pas des chaînes. Je pense que je dois utiliser datetime.date.fromtimestampmais je ne sais pas trop comment appliquer cela à l'ensemble de df.date.

Merci.

WA Carnegie
la source

Réponses:

221

Celles-ci semblent être des secondes depuis l'époque.

In [20]: df = DataFrame(data['values'])

In [21]: df.columns = ["date","price"]

In [22]: df
Out[22]: 
<class 'pandas.core.frame.DataFrame'>
Int64Index: 358 entries, 0 to 357
Data columns (total 2 columns):
date     358  non-null values
price    358  non-null values
dtypes: float64(1), int64(1)

In [23]: df.head()
Out[23]: 
         date  price
0  1349720105  12.08
1  1349806505  12.35
2  1349892905  12.15
3  1349979305  12.19
4  1350065705  12.15
In [25]: df['date'] = pd.to_datetime(df['date'],unit='s')

In [26]: df.head()
Out[26]: 
                 date  price
0 2012-10-08 18:15:05  12.08
1 2012-10-09 18:15:05  12.35
2 2012-10-10 18:15:05  12.15
3 2012-10-11 18:15:05  12.19
4 2012-10-12 18:15:05  12.15

In [27]: df.dtypes
Out[27]: 
date     datetime64[ns]
price           float64
dtype: object
Jeff
la source
1
et en 0.13, vous pourrez utiliser date_unit lorsque read_json: D
Andy Hayden
Génial! Votre solution est parfaitement logique. Pandas: La conversion en horodatage se déroule assez bien aussi maintenant que je connais to_datetime.
WA Carnegie
Juste un autre point. Cela n'a pas fonctionné pour moi en 0.11, mais bien en 0.12+
WA Carnegie
1
Cette solution me donne OverflowError: Python int too large to convert to C long.
si __name__ est None
2
Nevermind, avait un horodatage en millisecondes, juste dû lambda x: x/1000.0, ou unit='ms'.
si __name__ est None
48

Si vous essayez d'utiliser:

df[DATE_FIELD]=(pd.to_datetime(df[DATE_FIELD],***unit='s'***))

et recevez une erreur:

"pandas.tslib.OutOfBoundsDatetime: impossible de convertir l'entrée avec l'unité 's'"

Cela signifie que le DATE_FIELDn'est pas spécifié en secondes.

Dans mon cas, c'était milli secondes - EPOCH time.

La conversion a fonctionné en utilisant ci-dessous:

df[DATE_FIELD]=(pd.to_datetime(df[DATE_FIELD],unit='ms')) 
Sandesh
la source
16

En supposant que nous avons importé pandas as pdet dfest notre base de données

pd.to_datetime(df['date'], unit='s')

travaille pour moi.

fahim reza
la source
0

Alternativement, en modifiant une ligne du code ci-dessus:

# df.date = df.date.apply(lambda d: datetime.strptime(d, "%Y-%m-%d"))
df.date = df.date.apply(lambda d: datetime.datetime.fromtimestamp(int(d)).strftime('%Y-%m-%d'))

Cela devrait également fonctionner.

ipramusinto
la source