2012-11-13 38 views
15

Tôi có tên date_dict từ điển được khóa theo ngày giờ có giá trị tương ứng với số nguyên của các quan sát. Tôi chuyển đổi điều này thành một chuỗi/dataframe thưa thớt với các quan sát được kiểm duyệt mà tôi muốn tham gia hoặc chuyển đổi thành chuỗi/dataframe có ngày liên tục. Khó hiểu danh sách là hack của tôi để có được xung quanh thực tế là gấu trúc dường như sẽ không tự động bí mật các đối tượng ngày datetime một chỉ số DateTime thích hợp.Điền khung dữ liệu gấu liên tục từ khung dữ liệu thưa thớt

df1 = pd.DataFrame(data=date_dict.values(), 
        index=[datetime.datetime.combine(i, datetime.time()) 
          for i in date_dict.keys()], 
        columns=['Name']) 
df1 = df1.sort(axis=0) 

Ví dụ này có 1258 quan sát và chỉ số DateTime chạy từ 2003-06-24 đến 2012-11-07.

df1.head() 
      Name 
Date 
2003-06-24 2 
2003-08-13 1 
2003-08-19 2 
2003-08-22 1 
2003-08-24 5 

Tôi có thể tạo một khung dữ liệu trống với chỉ mục Ngày giờ liên tục, nhưng điều này giới thiệu một cột không cần thiết và có vẻ khó khăn. Tôi cảm thấy như thể tôi đang thiếu một giải pháp thanh lịch hơn liên quan đến việc tham gia.

df2 = pd.DataFrame(data=None,columns=['Empty'], 
        index=pd.DateRange(min(date_dict.keys()), 
             max(date_dict.keys()))) 
df3 = df1.join(df2,how='right') 
df3.head() 
      Name Empty 
2003-06-24 2 NaN 
2003-06-25 NaN NaN 
2003-06-26 NaN NaN 
2003-06-27 NaN NaN 
2003-06-30 NaN NaN 

Có một cách đơn giản hoặc thêm thanh lịch để điền vào một dataframe liên tục từ một dataframe thưa thớt để có được (1) một chỉ số liên tục, (2) Nans là 0s, và (3) không có cột trống bên trái trong khung dữ liệu?

  Name 
2003-06-24 2 
2003-06-25 0 
2003-06-26 0 
2003-06-27 0 
2003-06-30 0 

Trả lời

20

Bạn chỉ có thể sử dụng reindex trên một chuỗi thời gian bằng cách sử dụng phạm vi ngày của mình. Ngoài ra, có vẻ như bạn nên sử dụng một TimeSeries thay vì một DataFrame (xem documentation), mặc dù reindexing cũng là phương pháp chính xác để thêm các giá trị chỉ mục bị thiếu vào DataFrames.

Ví dụ, bắt đầu với:

date_index = pd.DatetimeIndex([pd.datetime(2003,6,24), pd.datetime(2003,8,13), 
     pd.datetime(2003,8,19), pd.datetime(2003,8,22), pd.datetime(2003,8,24)]) 

ts = pd.Series([2,1,2,1,5], index=date_index) 

Cung cấp cho bạn một chuỗi thời gian như đầu dụ dataframe của bạn:

2003-06-24 2 
2003-08-13 1 
2003-08-19 2 
2003-08-22 1 
2003-08-24 5 

Đơn giản chỉ cần làm

ts.reindex(pd.date_range(min(date_index), max(date_index))) 

sau đó cung cấp cho bạn một chỉ số hoàn chỉnh , với NaN cho các giá trị bị thiếu của bạn (bạn có thể sử dụng fillna nếu bạn muốn lấp đầy mi giá trị ssing với một số giá trị khác - xem here):

2003-06-24  2 
2003-06-25 NaN 
2003-06-26 NaN 
2003-06-27 NaN 
2003-06-28 NaN 
2003-06-29 NaN 
2003-06-30 NaN 
2003-07-01 NaN 
2003-07-02 NaN 
2003-07-03 NaN 
2003-07-04 NaN 
2003-07-05 NaN 
2003-07-06 NaN 
2003-07-07 NaN 
2003-07-08 NaN 
2003-07-09 NaN 
2003-07-10 NaN 
2003-07-11 NaN 
2003-07-12 NaN 
2003-07-13 NaN 
2003-07-14 NaN 
2003-07-15 NaN 
2003-07-16 NaN 
2003-07-17 NaN 
2003-07-18 NaN 
2003-07-19 NaN 
2003-07-20 NaN 
2003-07-21 NaN 
2003-07-22 NaN 
2003-07-23 NaN 
2003-07-24 NaN 
2003-07-25 NaN 
2003-07-26 NaN 
2003-07-27 NaN 
2003-07-28 NaN 
2003-07-29 NaN 
2003-07-30 NaN 
2003-07-31 NaN 
2003-08-01 NaN 
2003-08-02 NaN 
2003-08-03 NaN 
2003-08-04 NaN 
2003-08-05 NaN 
2003-08-06 NaN 
2003-08-07 NaN 
2003-08-08 NaN 
2003-08-09 NaN 
2003-08-10 NaN 
2003-08-11 NaN 
2003-08-12 NaN 
2003-08-13  1 
2003-08-14 NaN 
2003-08-15 NaN 
2003-08-16 NaN 
2003-08-17 NaN 
2003-08-18 NaN 
2003-08-19  2 
2003-08-20 NaN 
2003-08-21 NaN 
2003-08-22  1 
2003-08-23 NaN 
2003-08-24  5 
Freq: D, Length: 62 
+2

Cảm ơn! Tôi đã sử dụng ts.reindex (pd.date_range (min (date_index), max (date_index)), fill_value = 0) –

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