how to work around "ValueError: day is out of range for month" with imaginary dates?
how to work around "ValueError: day is out of range for month" with imaginary dates?
好的,我有一个日期列表,还有一个销售列表。我想使用 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()
是我创建的一个函数,它 return 是一个包含格式的字符串,我测试它没问题 %d/%m/%Y
。当我 运行 脚本时出现错误
ValueError: day is out of range for month
现在我知道原因是列表中的日期不是真实的,有些日期实际上并不存在(例如 31、6、2016)。有没有办法解决这个问题,让它忽略实际上不存在的日期?
编辑
我刚刚创建了这个函数:
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]]
在情节中使用它之前要删除不存在的日期,但我仍然收到相同的错误消息。
为确保忽略日期和销售额,您需要将两个数据点配对。
假设存在一对一的相关性(每个日期一次销售),那么您可以压缩值并过滤掉日期无效的值。
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]
此处假设您的日期和销售额是有序的,并且每个日期只有一个销售额。
我会通过这种方式忽略它们(if len(listOfDates) == len(listOfSales)
):
from datetime import datetime
x = []
y = []
for d, sale in zip(listOfDates, listOfSales):
try:
x.append(datetime.strptime(d, dateFormat).date())
y.append(sale/10)
except ValueError:
continue
validateDates
方法如下:
def validateDates(dateFormat, listOfDates, listOfSales):
dates, sales = [], []
for d, s in zip(listOfDates, listOfSales):
try:
datetime.strptime(d, dateFormat)
except ValueError:
continue
dates.append(d)
sales.append(s)
return dates, sales
listOfDates, listOfSales = validateDates(dateFormat, listOfDates, listOfSales)
好的,我有一个日期列表,还有一个销售列表。我想使用 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()
是我创建的一个函数,它 return 是一个包含格式的字符串,我测试它没问题 %d/%m/%Y
。当我 运行 脚本时出现错误
ValueError: day is out of range for month
现在我知道原因是列表中的日期不是真实的,有些日期实际上并不存在(例如 31、6、2016)。有没有办法解决这个问题,让它忽略实际上不存在的日期?
编辑 我刚刚创建了这个函数:
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]]
在情节中使用它之前要删除不存在的日期,但我仍然收到相同的错误消息。
为确保忽略日期和销售额,您需要将两个数据点配对。
假设存在一对一的相关性(每个日期一次销售),那么您可以压缩值并过滤掉日期无效的值。
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]
此处假设您的日期和销售额是有序的,并且每个日期只有一个销售额。
我会通过这种方式忽略它们(if len(listOfDates) == len(listOfSales)
):
from datetime import datetime
x = []
y = []
for d, sale in zip(listOfDates, listOfSales):
try:
x.append(datetime.strptime(d, dateFormat).date())
y.append(sale/10)
except ValueError:
continue
validateDates
方法如下:
def validateDates(dateFormat, listOfDates, listOfSales):
dates, sales = [], []
for d, s in zip(listOfDates, listOfSales):
try:
datetime.strptime(d, dateFormat)
except ValueError:
continue
dates.append(d)
sales.append(s)
return dates, sales
listOfDates, listOfSales = validateDates(dateFormat, listOfDates, listOfSales)