使用matplotlib绘制日期

时间:2017-06-04 20:39:43

标签: python matplotlib plot

我一直试图从包含日期和浮点数的逗号分隔的csv文件中绘制数据:

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

是否有简单的方法可以在情节中使用完整日期?

1 个答案:

答案 0 :(得分:1)

问题是日期,它们被转换为整数并且松散它们的前导零。然后  "01062017"变为1062017,然后被解释为(2017, 6, 10, 0, 0),因此每天2个数字,一个数字月份。对于5062017,因为没有6月的第6个月,它被解释为与(2017, 6, 5, 0, 0)不同且正确。

克服这种情况的最小侵入性方法是格式化字符串,使其在日期时间转换之前始终具有8个挖掘者:

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

作为最后一条评论:如果您可以选择输入文件的格式,则可能需要以非模糊的方式对其进行指定,例如: 20170601