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.

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

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

15

Dengan asumsi kami mengimpor pandas as pddan dfkerangka data kami

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

bekerja untuk saya.


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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.