Chuyển đổi thời gian unix thành ngày có thể đọc được trong khung dữ liệu gấu trúc


110

Tôi có một khung dữ liệu với thời gian và giá unix trong đó. Tôi muốn chuyển đổi cột chỉ mục để nó hiển thị theo ngày tháng mà con người có thể đọc được.

Vì vậy, ví dụ, tôi có datenhư 1349633705trong cột chỉ mục nhưng tôi muốn nó hiển thị dưới dạng 10/07/2012(hoặc ít nhất 10/07/2012 18:15).

Đối với một số ngữ cảnh, đây là mã tôi đang làm việc và những gì tôi đã thử:

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   

Như bạn có thể thấy, tôi đang sử dụng df.date = df.date.apply(lambda d: datetime.strptime(d, "%Y-%m-%d"))ở đây mà không hoạt động vì tôi đang làm việc với số nguyên, không phải chuỗi. Tôi nghĩ rằng tôi cần phải sử dụng datetime.date.fromtimestampnhưng tôi không chắc chắn làm thế nào để áp dụng điều này cho toàn bộ df.date.

Cảm ơn.

Câu trả lời:


220

Chúng dường như là giây kể từ kỷ nguyên.

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
và trong 0.13 bạn sẽ có thể sử dụng date_unit khi read_json: D
Andy Hayden

Tuyệt quá! Giải pháp của bạn có ý nghĩa hoàn hảo. Pandas: Việc chuyển đổi sang Dấu thời gian diễn ra khá tốt và giờ tôi cũng biết về to_datetime.
WA Carnegie

Chỉ là một điểm khác. Điều này không làm việc cho tôi trong 0.11, nhưng tốt trong 0.12+
WA Carnegie

1
Giải pháp này mang lại cho tôi OverflowError: Python int too large to convert to C long.
if __name__ is None

2
Nevermind, có dấu thời gian mili giây, phải lambda x: x/1000.0, hoặc unit='ms'.
if __name__ is None

48

Nếu bạn thử sử dụng:

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

và nhận được một lỗi:

"pandas.tslib.OutOfBoundsDatetime: không thể chuyển đổi đầu vào với đơn vị 's'

Điều này có nghĩa DATE_FIELDlà không được chỉ định trong vài giây.

Trong trường hợp của tôi, đó là mili giây - EPOCH time.

Việc chuyển đổi đã hoạt động bằng cách sử dụng bên dưới:

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

15

Giả sử chúng tôi đã nhập pandas as pddflà khung dữ liệu của chúng tôi

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

làm việc cho tôi.


0

Ngoài ra, bằng cách thay đổi một dòng của mã trên:

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

Nó cũng sẽ hoạt động.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.