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.
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. –
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
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. –