2017-06-04 103 views
0

我一直在試圖從其中包含日期和浮子一個逗號分隔的CSV文件繪製數據:與matplotlib繪製日期

Date,Price (€) 
01062017,20.90 
02062017,30.90 
03062017,40.90 
04062017,60.90 
05062017,50.90 

我然後嘗試用下面的代碼繪製這樣的:

import matplotlib.pyplot as plt 
import numpy as np 
import datetime 

dates,cost = np.loadtxt('price_check.csv',delimiter=',',skiprows=1,unpack=True) 

xdates = [datetime.datetime.strptime(str(int(date)),'%d%m%Y') for date in dates] 

fig = plt.figure() 
ax = plt.subplot(111) 
plt.plot(xdates, cost,'o-',label='Cost') 
plt.legend(loc=4) 
plt.ylabel('Price (Euro)') 
plt.xlabel('date') 
plt.gcf().autofmt_xdate() 
plt.grid() 
plt.savefig('sunglasses_cost.png') 
plt.show() 

然而,當數據被繪製,它看起來像前面的零在日期字符串被刪除:

enter image description here

是否有一個簡單的方法可以在劇情中使用完整日期?

+0

爲什麼在將日期提交給'datetime.datetime.strptime()'之前將日期變爲整數?這就是殺死你的領先零。 – zwer

回答

1

問題是日期,這些日期被轉換爲整數並且丟失了前導零。然後 "01062017"變成1062017,然後解釋爲(2017, 6, 10, 0, 0),所以2位數字爲一天,一位數月份。對於5062017,因爲沒有六月五十日,所以它被解釋爲與(2017, 6, 5, 0, 0)不同且正確。

最小侵入性的方法來克服,這將是格式化字符串,使其始終有日期時間轉換前8 digist:

xdates = [datetime.datetime.strptime('{:08}'.format(int(date)),'%d%m%Y') for date in dates] 

這一操作將導致正確的陰謀。但是,xticklabels可能會以不方便的方式顯示。這可以通過選擇一些定位和格式化

import matplotlib.dates as mdates 
plt.gca().xaxis.set_major_locator(mdates.DayLocator()) 
plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%d-%m-%Y')) 

enter code here

作爲最後的評論進行調整:如果你有選擇,選擇你的輸入文件的格式,它可能是值得在非specifing它模糊的方式,例如20170601

+0

謝謝!我已經控制了輸入文件的格式,所以在那裏做了改變。當我不知道的時候,仍然理解處理這個問題的方法! –