2012-03-09 35 views
36

Tôi đang cố gắng vẽ thông tin chống lại ngày tháng. Tôi có một danh sách các ngày theo định dạng "01/02/1991".Vẽ ngày tháng trên trục x với matplotlib của Python

tôi chuyển đổi chúng bằng cách làm như sau:

x = parser.parse(date).strftime('%Y%m%d')) 

mang đến cho 19910102

Sau đó, tôi cố gắng sử dụng num2date

import matplotlib.dates as dates 
new_x = dates.num2date(x) 

Vẽ:

plt.plot_date(new_x, other_data, fmt="bo", tz=None, xdate=True) 

Nhưng tôi gặp lỗi. Nó nói "ValueError: năm nằm ngoài phạm vi". Bất kỳ giải pháp?

+0

Ah, tôi đã đưa ra một ngày ví dụ xấu . Tôi không thực sự có ngày 31 tháng 12 năm 2012 trong danh sách ngày của mình. Tôi đã thay đổi nó thành ngày 02 tháng 1 năm 1991. –

+1

trợ giúp (num2date): "x là giá trị float cho một cộng với số ngày kể từ 0001-01-01", vì vậy x = 19910102 không tương ứng với 02 Jan 1991 –

Trả lời

14

Như @KyssTao đã nói, help(dates.num2date) nói rằng x phải là phao cho số ngày kể từ 0001-01-01 cộng một. Do đó, 19910102 không phải là ngày 2 tháng 1 năm 1991, bởi vì nếu bạn tính năm 19910101 ngày từ 0001-01-01, bạn sẽ nhận được điều gì đó trong năm 54513 hoặc tương tự (chia cho 365,25, số ngày trong một năm).

Sử dụng datestr2num thay thế (xem help(dates.datestr2num)):

new_x = dates.datestr2num(date) # where date is '01/02/1991' 
76

Bạn có thể làm điều này đơn giản hơn sử dụng plot() thay vì plot_date().

Thứ nhất, chuyển đổi chuỗi của bạn với các trường hợp Python datetime.date:

import datetime as dt 

dates = ['01/02/1991','01/03/1991','01/04/1991'] 
x = [dt.datetime.strptime(d,'%m/%d/%Y').date() for d in dates] 
y = range(len(x)) # many thanks to Kyss Tao for setting me straight here 

Sau đó, cốt truyện:

import matplotlib.pyplot as plt 
import matplotlib.dates as mdates 

plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%m/%d/%Y')) 
plt.gca().xaxis.set_major_locator(mdates.DayLocator()) 
plt.plot(x,y) 
plt.gcf().autofmt_xdate() 

Kết quả:

enter image description here

+0

bạn chỉ có thể viết y = range (len (x)) –

+0

Tôi chỉ biết rằng xrange() có thể được sử dụng tránh tạo ra một danh sách; nhưng ở đây chúng tôi tạo ra một danh sách anyways –

+0

Tôi vừa thực hiện một thử nghiệm thời gian với len (x) là 10Mio. Tôi mong đợi phạm vi() và danh sách của bạn hiểu với xrange() để có lâu như nhau; nhưng phạm vi bất ngờ của tôi() thậm chí còn nhanh hơn! –

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