如何解决" ValueError:day超出了一个月的范围"想象日期?

时间:2018-05-24 00:20:12

标签: python python-2.7 datetime matplotlib strptime

好的,所以我有一个日期列表,我有一份销售清单。我想用matplotlib绘制值

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

dateFormat = findDateFormat()

print dateFormat      #DEBUG#

x = [dt.datetime.strptime(d,dateFormat).date() for d in listOfDates]
y = listOfSales

plt.gca().xaxis.set_major_formatter(mdates.DateFormatter(dateFormat))
plt.gca().xaxis.set_major_locator(mdates.DayLocator())
plt.plot(x,y)
plt.gcf().autofmt_xdate()

findDateFormat()是我创建的一个函数,它返回一个包含格式的字符串,我测试它没关系%d/%m/%Y。当我运行脚本时,我收到了错误

  

ValueError:day超出了月份的范围

现在我知道原因是列表中的日期不是真实的,有些它们实际上并不存在(例如31,6,2016)。有没有办法解决这个问题,所以它只是忽略了那些不存在的日期?

EDIT 我刚刚创建了这个函数:

def validateDates(dateFormat):

    itemsToDelete = []

    for i in range(0,len(listOfDates)):
        try:
            dt.datetime.strptime(listOfDates[i], dateFormat)
        except ValueError:
            print listOfDates[i] + "Has been deleted because it does not exist."
            itemsToDelete.append(i)

    for k in range(0,len(itemsToDelete)):
        del listOfDates[itemsToDelete[k]]
        del listOfSales[itemsToDelete[k]]

要在绘图中使用它之前删除不存在的日期,但我仍然会收到相同的错误消息。

1 个答案:

答案 0 :(得分:0)

要确保忽略日期和销售,您需要将两个数据点配对。

假设存在一对一的关联(每个日期一次销售),那么您只需压缩值并过滤掉日期无效的值。

dateFormat = findDateFormat()

def is_valid_date(pair):
   try:
     return (dt.datetime.strptime(pair[0], dateFormat).date(), pair[1])
   except ValueError:
     return None

valid_pairs = filter(is_valid_date, zip(listOfDates, listOfSales))
x = [i[0] for i in valid_pairs]
y = [i[1] for i in valid_pairs]

这里的假设是订购了您的日期和销售,每个日期只有一个销售数字。