【问题标题】:ValueError: time data '' does not match format '%d-%m-%Y %H:%M:%S'ValueError: 时间数据 '' 与格式 '%d-%m-%Y %H:%M:%S' 不匹配
【发布时间】:2016-10-15 12:09:27
【问题描述】:

我想做的是:

  1. 删除 csv 日期低于 25.05.2016 23:59 的所有行
  2. 用不同的名称保存文件

我在 col A 的 csv 中有以下数据

WFQVG98765
FI Quality-Value-Growth
Some Random String 1

Datum
13-05-2016 23:59
14-05-2016 23:59
15-05-2016 23:59
16-05-2016 23:59
17-05-2016 23:59
18-05-2016 23:59
19-05-2016 02:03
.

.

.

.

这是我现在尝试的方法

import csv
import datetime
from dateutil.parser import parse

def is_date(string):
    try: 
        parse(string)
        return True
    except ValueError:
        return False

'''
1. Delete all rows where csv date is lower than 25.05.2016 23:59
2. Save the file with a different name
'''

cmpDate = datetime.datetime.strptime('25.05.2016 23:59:00', '%d.%m.%Y %H:%M:%S')

with open('WF.csv', 'r') as csvfile:
     csvReader = csv.reader(csvfile, delimiter=',')
     for row in csvReader:
         print (row[0])
         if is_date(row[0]) and not row[0].strip(' '):
            csvDate = datetime.datetime.strptime(row[0], '%d-%m-%Y %H:%M:%S') 'Error Here : ValueError: time data '' does not match format '%d-%m-%Y %H:%M:%S'

我也试过这个错误行

            csvDate = datetime.datetime.strptime(row[0], '%d-%m-%Y %H:%M')      'But got the same error
             if csvDate<cmpDate:
                 print (row[0]+'TRUE')

如果条件为真,我如何删除该行并最终以不同的名称保存它?

【问题讨论】:

    标签: python csv datetime


    【解决方案1】:

    您可以分析每一行以比较日期,并将要保留的行保存在 list 中。然后,您可以将这些行存储到一个新的 csv 文件中,如果不再需要旧的,则将其删除。

    这是一个可以满足您要求的片段:

    import csv
    from datetime import datetime
    
    cmpDate = datetime.strptime('25.05.2016 23:59:00', '%d.%m.%Y %H:%M:%S')
    
    
    def is_lower(date_str):
        try:
            csvDate = datetime.strptime(row[0], '%d-%m-%Y %H:%M')
            return (csvDate < cmpDate)
        except:
            pass
    
    with open('WF.csv', 'r') as csvfile:
        csvReader = csv.reader(csvfile, delimiter=',')
        data = [row for row in csvReader if not is_lower(row[0])]
    
    with open('output.csv', 'w') as csvfile:
        writer = csv.writer(csvfile, delimiter=',')
        [writer.writerow(row) for row in data]
    

    【讨论】:

    • 谢谢,但我不明白为什么它会在两行之间留下一个空白行,这实际上不起作用,即在 output.csv 文件中我有输入文件中的所有行:/
    • @newguy 您的输入 csv 是否使用 , 作为分隔符?第一行有日期吗?你能把你的csv文件的前几行加上一个标题吗?
    • 问题包含 csv 列 A 中的确切文本,是的 , 是我的 csv 的分隔符
    【解决方案2】:

    is_date() 给你误报。检查日期格式时要更加严格,并且在将日期字符串加载到 datetime 时要保持一致 - 遵循 Zen of Python 的原则之一 - “应该有一种——最好只有一种——明显的方式来做到这一点":

    def is_date(date_string):
        try: 
            datetime.datetime.strptime(date_string, '%d-%m-%Y %H:%M:%S')
            return True
        except ValueError:
            return False
    

    换句话说,不要混用dateutil.parser.parse()datetime.datetime.strptime()

    【讨论】:

      【解决方案3】:

      datetime.datetime.strptime 异常表示您将一个空白字符串传递给row[0] 中的函数。

      解决该问题后,您需要添加代码以将可接受的行写入新文件。

      【讨论】:

      • 是的,我知道这可能是错误,但这条线 if is_date(row[0]) and not row[0].strip(' '): 不应该处理这个问题吗?即如果该行有空白,它将不会执行它
      • not 的作用与您想要的相反。
      【解决方案4】:

      当您调用 strip 时,您进行了错误的比较。两件事:

      • 首先,只需使用row[0].strip()(不带参数)。这将删除所有空格(如换行符等),而不仅仅是空格。
      • 其次,if is_date(row[0]) and not row[0].strip(' ') 仅在 row[0] 为空时通过,这与您想要的相反。这应该是if row[0].strip() and is_date(row[0]):

      更好的是,考虑到您的is_date 函数是如何实现的,您可能应该将您的日期时间创建放入一个处理错误的函数中。这是我通常的模式:

      def parse_date(str_date):
          try: 
              return datetime.datetime.strptime(str_date, '%d-%m-%Y %H:%M')
          except ValueError:
              return None
      
      cmp_date = datetime.datetime.strptime('25.05.2016 23:59:00', '%d.%m.%Y %H:%M:%S')
      
      output_rows = []
      with open('WF.csv', 'r') as csvfile:
          reader = csv.reader(csvfile, delimiter=',')
          for row in reader:
              csv_date = parse_date(row[0].strip())  # returns a datetime or None
              if csv_date and csv_date >= cmp_date:
                  output_rows.append(row)
      
      # Finally, write output_rows to the output file
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-06-04
        • 2022-01-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-11
        • 2019-05-24
        相关资源
        最近更新 更多