Как обойти «ValueError: день выходит за рамки месяца» с мнимыми датами? - PullRequest
0 голосов
/ 24 мая 2018

хорошо, у меня есть список дат и список продаж.Я хочу использовать 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: день выходит за пределы диапазона для месяца

теперь я знаю причину того, что даты в спискене реально, и некоторые из них на самом деле не существуют (например, 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]]

Чтобы избавиться от несуществующих датперед использованием этого в сюжете, но я все еще получаю то же сообщение об ошибке.

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

Я бы просто проигнорировал их следующим образом (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)
0 голосов
/ 24 мая 2018

Чтобы убедиться, что вы игнорируете как даты, так и продажи, вам нужно соединить две точки данных вместе.

Если предположить, что существует корреляция один к одному (одна продажа в день), то вы можетепросто заархивируйте значения и отфильтруйте те, где дата недействительна.

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]

Предполагается, что ваши даты и ваши продажи заказаны, и существует только один показатель продаж на дату.

...