2017-11-21 31 views
9

Tôi vừa cập nhật gấu trúc từ 0.17.1 đến 0.21.0 để tận dụng một số chức năng mới và gặp sự cố tương thích với matplotlib (mà tôi cũng cập nhật lên 2.1.0 mới nhất) . Đặc biệt, đối tượng Dấu thời gian dường như được thay đổi đáng kể.pandas 0.21.0 Vấn đề tương thích dấu thời gian với matplotlib

Tôi tình cờ có máy khác vẫn chạy các phiên bản cũ của gấu trúc (0.17.1)/matplotlib (1.5.1) mà tôi sử dụng để so sánh sự khác biệt:

Cả hai phiên bản hiển thị chỉ số DataFrame tôi để được dtype='datetime64[ns]

DatetimeIndex(['2017-03-13', '2017-03-14', ... '2017-11-17'], type='datetime64[ns]', name='dates', length=170, freq=None) 

Nhưng khi gọi type(df.index[0]), 0.17.1 cho pandas.tslib.Timestamp và 0.21.0 cho pandas._libs.tslib.Timestamp.

Khi âm mưu với df.index như trục x:

plt.plot(df.index, df['data']) 

matplotlibs bởi định dạng mặc định các nhãn trục x là số ngày cho gấu trúc 0.17.1 nhưng thất bại trong việc nhận ra nó cho gấu trúc 0.21.0 và chỉ đơn giản là cung cấp cho nguyên số 1.5e18 (thời gian epoch trong nanosec).

Tôi cũng có một con trỏ tùy chỉnh báo cáo nhấp vị trí trên đồ thị bằng cách sử dụng matplotlib.dates.DateFormatter trên x-giá trị mà không cho 0.21.0 với:

OverflowError: signed integer is greater than maximum 

tôi có thể nhìn thấy trong gỡ lỗi các báo cáo x có giá trị là khoảng 736500 (tức là số ngày kể từ năm 0) cho 0,17,1 nhưng là khoảng 1,5e18 (tức là thời gian epochec nanosec) cho 0,21,0.

Tôi rất ngạc nhiên trước sự gián đoạn này về tính tương thích giữa matplotlib và gấu trúc vì chúng rõ ràng được sử dụng cùng nhau bởi hầu hết mọi người. Tôi có thiếu một cái gì đó trong cách tôi gọi chức năng cốt truyện ở trên cho các phiên bản mới hơn?

Cập nhật như tôi đã đề cập ở trên, tôi thích trực tiếp gọi plot với một trục cho đối tượng nhưng chỉ dành riêng cho các heck của nó, tôi đã cố gắng gọi phương thức âm mưu của DataFrame tự df.plot(). Ngay sau khi việc này được thực hiện, tất cả các ô tiếp theo sẽ nhận diện chính xác Dấu thời gian trong cùng phiên python. Nó giống như một biến môi trường được thiết lập, bởi vì tôi có thể tải lại một DataFrame khác hoặc tạo một trục khác với subplots và không hiển thị 1.5e18 ở đâu. Điều này thực sự có mùi giống như một lỗi như gấu trúc doc gần đây nhất nói pandas:

The plot method on Series and DataFrame is just a simple wrapper around plt.plot() 

Nhưng rõ ràng nó làm điều gì đó với phiên python mà âm mưu tiếp theo đối phó với chỉ số Timestamp đúng cách.

Trong thực tế, bạn chỉ cần chạy ví dụ tại gấu trúc ở trên liên kết:

import pandas as pd 
import numpy as np 
import matplotlib.pyplot as plt 
ts = pd.Series(np.random.randn(1000), index=pd.date_range('1/1/2000', periods=1000)) 

Tùy thuộc vào việc ts.plot() được gọi hay không, cốt truyện sau một trong hai cách chính xác định dạng trục x là số ngày hay không:

plt.plot(ts.index,ts) 
plt.show() 

Khi âm mưu của thành viên được gọi, sau đó gọi plt.plot trên Series mới hoặc DataFrame sẽ tự động định dạng chính xác mà không cần gọi lại phương thức lô hội viên.

Trả lời

6

Có một số issue with pandas datetimes and matplotlib đến từ bản phát hành gấu trúc 0,21 gần đây, không đăng ký chuyển đổi của nó nữa khi nhập. Một khi bạn sử dụng những bộ chuyển đổi một lần (trong gấu trúc), chúng sẽ được đăng ký và tự động được sử dụng bởi matplotlib.

Một cách giải quyết sẽ được đăng ký chúng bằng tay,

import pandas.plotting._converter as pandacnv 
pandacnv.register() 

Trong mọi trường hợp vấn đề này nổi tiếng ở cả hai gấu trúc và phía matplotlib, vì vậy sẽ có một số loại bản sửa lỗi cho các phiên bản tiếp theo. Gấu trúc đang suy nghĩ về readding the register trong một bản phát hành đầy đủ. Vì vậy, vấn đề này có thể chỉ có tạm thời. Một tùy chọn cũng là để hoàn nguyên về gấu trúc 0.20.x, nơi điều này sẽ không xảy ra.

+0

bạn nói đúng, tôi nhận được phản hồi tương tự về vấn đề tôi đã mở tại gấu trúc github. Tôi đang đăng một phương thức chính thức hơn một chút từ trang web gấu trúc mà tôi đã cố gắng làm việc. –

+0

Bạn có thử phương pháp này ở đây không? Bạn có thể báo cáo về việc nó có hoạt động hay không (về mặt lý thuyết, nhưng tôi không thể thử và nếu không tốt hơn thì tôi nên xóa câu trả lời). – ImportanceOfBeingErnest

+0

Tôi đã thử và nó cũng làm việc - tôi đã kết thúc bằng cách sử dụng hai dòng từ trang web gấu trúc như có lẽ họ có nhiều khả năng là bằng chứng trong tương lai. –

5

Sau khi mở issue trên gấu trúc github, tôi biết rằng đây thực sự là một số issue được biết đến giữa gấu trúc và matplotlib liên quan đến đăng ký tự động chuyển đổi đơn vị. Trong thực tế nó đã được liệt kê vào những gì mới page mà tôi đã thất bại trong việc nhìn thấy trước đây, cùng với các cách thích hợp để đăng ký chuyển đổi:

from pandas.tseries import converter 
converter.register() 

này cũng được thực hiện lần đầu tiên một phương pháp cốt truyện thành viên được gọi là trên một dòng hoặc DataFrame giải thích những gì tôi đã quan sát ở trên. Có vẻ như đã được thực hiện với ý định rằng matplotlib có nghĩa vụ phải thực hiện một số hỗ trợ cơ bản cho thời gian datas gấu trúc, nhưng thực sự một cảnh báo không dùng nữa của một số loại có thể hữu ích cho việc nghỉ như vậy. Tuy nhiên cho đến khi matplotlib thực sự thực hiện hỗ trợ như vậy (hoặc một số loại cơ chế đăng ký lười biếng), thực tế tôi luôn đặt hai dòng đó vào việc nhập gấu trúc. Vì vậy, tôi không chắc chắn lý do tại sao gấu trúc sẽ muốn vô hiệu hóa đăng ký tự động nhập khẩu trước khi mọi thứ đã sẵn sàng ở phía matplotlib.

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