2016-01-19 44 views
19

Tôi cần xử lý một lượng lớn tệp CSV trong đó dấu thời gian luôn là chuỗi đại diện cho dấu thời gian unix tính bằng mili giây. Tôi không thể tìm thấy một phương pháp nào để sửa đổi các cột này một cách hiệu quả.Pandas chuyển đổi hàng có dấu thời gian unix (tính bằng mili giây) thành datetime

Đây là những gì tôi đã đưa ra, tuy nhiên điều này tất nhiên chỉ sao chép cột và tôi phải bằng cách nào đó đặt nó trở lại tập dữ liệu gốc. Tôi chắc rằng nó có thể được thực hiện khi tạo DataFrame?

import sys 
if sys.version_info[0] < 3: 
    from StringIO import StringIO 
else: 
    from io import StringIO 
import pandas as pd 

data = 'RUN,UNIXTIME,VALUE\n1,1447160702320,10\n2,1447160702364,20\n3,1447160722364,42' 

df = pd.read_csv(StringIO(data)) 

convert = lambda x: datetime.datetime.fromtimestamp(x/1e3) 
converted_df = df['UNIXTIME'].apply(convert) 

này sẽ chọn cột 'UNIXTIME' và thay đổi nó từ

0 1447160702320 
1 1447160702364 
2 1447160722364 
Name: UNIXTIME, dtype: int64 

vào này

0 2015-11-10 14:05:02.320 
1 2015-11-10 14:05:02.364 
2 2015-11-10 14:05:22.364 
Name: UNIXTIME, dtype: datetime64[ns] 

Tuy nhiên, tôi muốn sử dụng cái gì đó như pd.apply() để có được toàn bộ dữ liệu được trả về với cột được chuyển đổi hoặc như tôi đã viết, chỉ cần tạo các datetimes khi tạo DataFrame từ CSV.

Trả lời

20

Bạn có thể làm điều này như một bước bài chế biến sử dụng to_datetime và đi qua arg unit='ms':

In [5]: 
df['UNIXTIME'] = pd.to_datetime(df['UNIXTIME'], unit='ms') 
df 

Out[5]: 
    RUN    UNIXTIME VALUE 
0 1 2015-11-10 13:05:02.320  10 
1 2 2015-11-10 13:05:02.364  20 
2 3 2015-11-10 13:05:22.364  42 
+0

Ah, tôi hoàn toàn bỏ qua tham số 'đơn vị' đó, cảm ơn, đó là một thông số tốt! Tôi sẽ thực hiện một yêu cầu kéo để bao gồm trong '.read_csv' quá thông qua parse_dates. – tamasgal

+0

Điều này có thể dẫn đến sai thời gian do vấn đề múi giờ. –

+0

@PengjuZhao câu hỏi của OP không đề cập đến múi giờ, vì câu trả lời của Teudimundo giải quyết rằng – EdChum

2

tôi đã đưa ra một giải pháp tôi đoán:

convert = lambda x: datetime.datetime.fromtimestamp(float(x)/1e3) 

df = pd.read_csv(StringIO(data), parse_dates=['UNIXTIME'], date_parser=convert) 

Tôi vẫn không chắc chắn nếu điều này là một trong những tốt nhất mặc dù.

4

tôi sử dụng giải pháp @EdChum, nhưng tôi thêm công tác quản lý múi giờ:

df['UNIXTIME']=pd.DatetimeIndex(pd.to_datetime(pd['UNIXTIME'], unit='ms'))\ 
       .tz_localize('UTC')\ 
       .tz_convert('America/New_York') 

các tz_localize cho biết dấu thời gian nên được xem xét liên quan đến 'UTC', sau đó tz_convert thực sự di chuyển ngày/giờ sang múi giờ chính xác (trong trường hợp này là 'America/New_York').

Lưu ý rằng nó đã được chuyển đổi thành DatetimeIndex vì phương pháp tz_ chỉ hoạt động trên chỉ mục của chuỗi. Vì Pandas 0,15 người ta có thể sử dụng .dt:

df['UNIXTIME']=pd.to_datetime(pd['UNIXTIME'], unit='ms')\ 
       .dt.tz_localize('UTC')\ 
       .dt.tz_convert('America/New_York') 
Các vấn đề liên quan