2016-06-14 80 views
2

我所试图做的是:ValueError异常:实时数据 '' 不匹配格式 '%D-%间%Y%H:%M:%S'

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

我有以下在山坳的CSV数据A

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') 

Here how can I delete the row if the condition is true and finally save it with a different name ?

回答

2

您可以分析每一行以比较日期,并将要保留的行保存在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] 
+0

谢谢,但我不这样做为什么它留下两行之间的空行,这实际上并不工作,即在output.csv文件中我有所有的行输入文件:/ – newguy

+0

@newguy输入csv是否使用','作为分隔符?它在第一行有日期吗?你可以把你的csv文件头几行添加一个头文件吗? – kardaj

+0

这个问题有确切的文字是什么在csv列A和是','是我的csv的分隔符 – newguy

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()

2

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

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

+0

是的,我知道,也许错误,但不应该在该行'如果is_date(行[0]),而不是行[0] .strip(”“):'照顾那个?即如果该行有空白,它将不会执行它 – newguy

+0

“不”与您希望它执行的操作相反。 –

+0

哦,我的坏只是开始学习python感谢:) – newguy

2

,当你调用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功能是如何实现的,你应该只是把你的datetime创建到处理错误的功能。这是我一贯的模式:

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 
相关问题