我一直试图从包含日期和浮点数的逗号分隔的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()
然而,当绘制数据时,它看起来像是在删除日期字符串中的前导零:
是否有简单的方法可以在情节中使用完整日期?
答案 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'))
作为最后一条评论:如果您可以选择输入文件的格式,则可能需要以非模糊的方式对其进行指定,例如: 20170601
。