Konvertieren Sie die Unix-Zeit in ein lesbares Datum im Pandas-Datenrahmen

109

Ich habe einen Datenrahmen mit Unix-Zeiten und Preisen. Ich möchte die Indexspalte so konvertieren, dass sie in von Menschen lesbaren Daten angezeigt wird.

So habe ich zum Beispiel datewie 1349633705in der Indexspalte, aber ich möchte, dass es als 10/07/2012(oder zumindest 10/07/2012 18:15) angezeigt wird .

In einigen Zusammenhängen ist hier der Code, mit dem ich arbeite, und was ich bereits versucht habe:

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   

Wie Sie sehen, verwende ich df.date = df.date.apply(lambda d: datetime.strptime(d, "%Y-%m-%d"))hier, was nicht funktioniert, da ich mit ganzen Zahlen und nicht mit Zeichenfolgen arbeite. Ich denke, ich muss verwenden, datetime.date.fromtimestampaber ich bin nicht ganz sicher, wie ich das auf das Ganze anwenden soll df.date.

Vielen Dank.

WA Carnegie
quelle

Antworten:

218

Dies scheinen Sekunden seit der Epoche zu sein.

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
quelle
1
und in 0.13 können Sie date_unit verwenden, wenn read_json: D
Andy Hayden
Toll! Ihre Lösung ist absolut sinnvoll. Pandas: Das Konvertieren in Zeitstempel läuft ziemlich gut, auch jetzt weiß ich über to_datetime Bescheid.
WA Carnegie
Nur ein weiterer Punkt. Dies funktionierte nicht für mich in 0.11, aber gut in 0.12+
WA Carnegie
1
Diese Lösung gibt mir OverflowError: Python int too large to convert to C long.
wenn __name__ None ist
2
Egal, hatte einen Millisekunden-Zeitstempel, musste einfach lambda x: x/1000.0oder unit='ms'.
wenn __name__ None ist
48

Wenn Sie versuchen,:

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

und erhalte einen Fehler:

"pandas.tslib.OutOfBoundsDatetime: Eingabe mit Einheit 's' kann nicht konvertiert werden"

Dies bedeutet, dass das DATE_FIELDnicht in Sekunden angegeben wird.

In meinem Fall waren es Millisekunden - EPOCH time.

Die Konvertierung funktionierte wie folgt:

df[DATE_FIELD]=(pd.to_datetime(df[DATE_FIELD],unit='ms')) 
Sandesh
quelle
15

Angenommen, wir haben importiert pandas as pdund dfsind unser Datenrahmen

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

funktioniert bei mir.

fahim reza
quelle
0

Alternativ können Sie eine Zeile des obigen Codes ändern:

# 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'))

Es sollte auch funktionieren.

ipramusinto
quelle