Ubah waktu unix menjadi tanggal yang dapat dibaca dalam bingkai data panda

110

Saya memiliki kerangka data dengan waktu unix dan harga di dalamnya. Saya ingin mengubah kolom indeks agar ditampilkan dalam tanggal yang dapat dibaca manusia.

Jadi misalnya saya memiliki dateseperti 1349633705di kolom indeks tetapi saya ingin itu ditampilkan sebagai 10/07/2012(atau setidaknya 10/07/2012 18:15).

Untuk beberapa konteks, berikut adalah kode yang saya kerjakan dan yang sudah saya coba:

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   

Seperti yang Anda lihat, saya menggunakan di df.date = df.date.apply(lambda d: datetime.strptime(d, "%Y-%m-%d"))sini yang tidak berfungsi karena saya bekerja dengan integer, bukan string. Saya pikir saya perlu menggunakan datetime.date.fromtimestamptetapi saya tidak begitu yakin bagaimana menerapkan ini ke seluruh df.date.

Terima kasih.

WA Carnegie
sumber

Jawaban:

221

Tampaknya ini hanya beberapa detik sejak zaman.

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
sumber
1
dan dalam 0,13 Anda akan dapat menggunakan date_unit saat read_json: D
Andy Hayden
Bagus! Solusi Anda masuk akal. Panda: Mengonversi ke Stempel Waktu berjalan cukup baik juga sekarang saya tahu tentang to_datetime.
WA Carnegie
Hanya poin lain. Ini tidak berhasil untuk saya di 0.11, tapi bagus di 0.12+
WA Carnegie
1
Solusi ini memberi saya OverflowError: Python int too large to convert to C long.
jika __name__ is None
2
Tidak masalah, memiliki stempel waktu milidetik, hanya perlu lambda x: x/1000.0, atau unit='ms'.
jika __name__ is None
48

Jika Anda mencoba menggunakan:

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

dan menerima kesalahan:

"pandas.tslib.OutOfBoundsDatetime: tidak dapat mengonversi masukan dengan unit '"

Ini berarti DATE_FIELDtidak ditentukan dalam hitungan detik.

Dalam kasus saya, itu mili detik - EPOCH time.

Konversi bekerja menggunakan di bawah ini:

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

Dengan asumsi kami mengimpor pandas as pddan dfkerangka data kami

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

bekerja untuk saya.

fahim reza
sumber
0

Atau, dengan mengubah satu baris kode di atas:

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

Ini juga harus bekerja.

ipramusinto
sumber