2012-09-04 37 views
5

Tôi có một số tập tin CSV với các định dạng:Sử dụng gấu trúc python để phân tích CSV với ngày ở định dạng Năm, Ngày, Giờ, Min, Sec

Year,Day,Hour,Min,Sec.,P1'S1 
2003, 1, 0, 0,12.22, 0.541 
2003, 1, 1, 0,20.69, 0.708 
2003, 1, 2, 0, 4.95, 0.520 
2003, 1, 3, 0,13.42, 0.539 
... 

(nơi ngày, là ngày diễn ra năm) và tôi đang cố gắng đọc chúng bằng cách sử dụng thư viện gấu trúc (có vẻ là một thư viện tuyệt vời cho đến nay).

Có chức năng tích hợp để đọc CSV ở gấu trúc và thậm chí tốt hơn, chức năng đó được cho là kiểm tra các cột cho loại ngày. và tự động sử dụng nó như là một chỉ mục (mà sẽ hoàn toàn chính xác cho những gì tôi đang làm).

Vấn đề là tôi không thể làm cho nó hoạt động với dữ liệu ngày ở định dạng này.

tôi đã cố gắng:

data = pd.read_csv("csvFile.csv", index_col=[0, 1], , index_col=[0, 1, 2, 3, 4] parse_dates=True) 

nhưng nó chỉ được năm một cách chính xác:

In [36]: data.index 
Out[36]: 
MultiIndex 
[(<Timestamp: 2003-09-04 00:00:00>, 1, 0, 0, 12.22) 
(<Timestamp: 2003-09-04 00:00:00>, 1, 1, 0, 20.69) 
(<Timestamp: 2003-09-04 00:00:00>, 1, 2, 0, 4.95) ..., 
(<Timestamp: 2003-09-04 00:00:00>, 365, 21, 0, 3.77) 
(<Timestamp: 2003-09-04 00:00:00>, 365, 22, 0, 14.6) 
(<Timestamp: 2003-09-04 00:00:00>, 365, 23, 0, 13.36)] 

Từ các tài liệu, tôi thấy rằng bạn có thể chỉ định "date_parser" thuộc tính trong read_csv chức năng của gấu trúc. Nhưng tài liệu không cho thấy cách và tôi không thể hình dung ra được. Bất cứ ai có kinh nghiệm về chủ đề có thể trao tay.

Chúc mừng, Bruno

Trả lời

11

Để phân tích một ngày nhiều cột, bạn cần phải nói cho gấu trúc cột nên được kết hợp vào một ngày duy nhất, vì vậy bạn cần phải nói parse_dates=['Year','Day','Hour','Min','Sec']

Bạn cũng cần để xác định phân tích cú pháp của riêng bạn mà phải mất một yếu tố từ mỗi cột bạn chỉ định trong parse_dates:

In [1]: import pandas as pd 

In [2]: from datetime import datetime, timedelta 

In [3]: from cStringIO import StringIO 

In [4]: data = """\ 
Year,Day,Hour,Min,Sec.,P1'S1 
2003, 1, 0, 0,12.22, 0.541 
2003, 1, 1, 0,20.69, 0.708 
2003, 1, 2, 0, 4.95, 0.520 
2003, 1, 3, 0,13.42, 0.539 
""" 

In [5]: def parse(yr, doy, hr, min, sec): 
    yr, doy, hr, min = [int(x) for x in [yr, doy, hr, min]] 
    sec = float(sec) 
    mu_sec = int((sec - int(sec)) * 1e6) 
    sec = int(sec) 
    dt = datetime(yr - 1, 12, 31) 
    delta = timedelta(days=doy, hours=hr, minutes=min, seconds=sec, 
         microseconds=mu_sec) 
    return dt + delta 
    ...: 

In [6]: pd.read_csv(StringIO(data), parse_dates={'datetime':  
      ['Year','Day','Hour','Min','Sec.']}, 
      date_parser=parse, index_col='datetime') 
Out[6]: 
          P1'S1 
datetime       
2003-01-01 00:00:12.220000 0.541 
2003-01-01 01:00:20.690000 0.708 
2003-01-01 02:00:04.950000 0.520 
2003-01-01 03:00:13.419999 0.539 
+0

tôi đã kiểm tra, và vấn đề là các tập tin có một không gian trước khi "năm" tiêu đề (giống như các giá trị năm bên dưới nó). Nó hoạt động hoàn hảo nếu tôi đặt một không gian trong read_csv trước khi 'Year' trở thành 'Year'. Rất cầu kỳ, nhưng hoạt động. Cảm ơn bạn! – jbssm

Các vấn đề liên quan