【问题标题】:how to work around "ValueError: day is out of range for month" with imaginary dates?如何使用假想日期解决“ValueError:day is out of range for month”?
【发布时间】:2018-11-03 01:58:27
【问题描述】:

好的,所以我有一个日期列表,我有一个销售列表。我想使用 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 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]]

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

【问题讨论】:

  • 你想给那些无效的日期一个默认值,或者你只是想完全忽略这些点?
  • 忽略了@BurhanKhalid

标签: python python-2.7 datetime matplotlib strptime


【解决方案1】:

我会通过这种方式忽略它们(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)

【讨论】:

    【解决方案2】:

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

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

    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]
    

    这里的假设是你的日期和你的销售额是有序的,每个日期只有一个销售数字。

    【讨论】:

      猜你喜欢
      • 2021-03-30
      • 1970-01-01
      • 2019-04-28
      • 2022-10-09
      • 1970-01-01
      • 2021-02-28
      • 2019-04-14
      • 1970-01-01
      • 2020-05-22
      相关资源
      最近更新 更多