2016-06-14 82 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 
相關問題