Pandas veri çerçevesindeki unix zamanını okunabilir tarihe dönüştürün


110

İçinde unix zamanları ve fiyatları olan bir veri çerçevem ​​var. İndeks sütununu, okunabilir tarihlerde gösterilmesi için dönüştürmek istiyorum.

Örneğin , indeks sütununda olduğu dategibi var 1349633705ama bunun 10/07/2012(veya en azından 10/07/2012 18:15) olarak gösterilmesini istiyorum .

Bazı bağlamlar için, işte çalıştığım kod ve daha önce denediğim şey:

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   

Gördüğünüz gibi df.date = df.date.apply(lambda d: datetime.strptime(d, "%Y-%m-%d"))burada kullanıyorum , bu işe yaramıyor çünkü tamsayılarla değil, dizelerle değil. Sanırım kullanmam gerekiyor datetime.date.fromtimestampama bunu bütününe nasıl uygulayacağımdan pek emin değilim df.date.

Teşekkürler.

Yanıtlar:


222

Bunlar çağdan beri saniyeler gibi görünüyor.

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
ve 0.13'te date_unit'i read_json: D
Andy Hayden

Harika! Çözümünüz çok mantıklı. Pandalar: Zaman Damgalarına dönüştürmek oldukça hoş bir şekilde geçiyor ve artık to_datetime hakkında bilgim var.
WA Carnegie

Sadece başka bir nokta. Bu benim için 0.11'de işe yaramadı, ancak 0.12+ için iyi
WA Carnegie

1
Bu çözüm bana veriyor OverflowError: Python int too large to convert to C long.
__name__ Yok ise

2
Nevermind, milisaniye zaman damgası vardı lambda x: x/1000.0, ya da vardı unit='ms'.
__name__ Yok ise

48

Kullanmayı denerseniz:

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

ve bir hata alırsınız:

"pandas.tslib.OutOfBoundsDatetime: birim 's' ile girdi dönüştürülemez"

Bu DATE_FIELD, saniye cinsinden belirtilmediği anlamına gelir .

Benim durumumda, mili saniyeydi - EPOCH time.

Dönüşüm aşağıdakileri kullanarak çalıştı:

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

16

Veri çerçevemiz olduğunu pandas as pdve içe dfaktardığımızı varsayarsak

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

benim için çalışıyor.


0

Alternatif olarak, yukarıdaki kodun bir satırını değiştirerek:

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

Aynı zamanda çalışmalıdır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.