Stupid_Intern
Stupid_Intern

Reputation: 3460

ValueError: time data '' does not match format '%d-%m-%Y %H:%M:%S'

What I am trying to do is:

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

I have the following data in a csv in col 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
.

.

.

.

This is what I have tried now

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'

I also tried this for the error line

            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 ?

Upvotes: 2

Views: 5690

Answers (4)

Henry Keiter
Henry Keiter

Reputation: 17188

You're doing the wrong comparison when you call strip. Two things:

  • First of all, just use row[0].strip() (with no arguments). This will strip all whitespace (like newlines, etc), not just spaces.
  • Secondly, if is_date(row[0]) and not row[0].strip(' ') only passes when row[0] is empty, which is the opposite of what you want. This should be if row[0].strip() and is_date(row[0]):

Even better, given how your is_date function is implemented, you should probably just put your datetime creation into a function that handles errors. This is my usual pattern:

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

Upvotes: 2

kardaj
kardaj

Reputation: 1935

You can analyse each row to compare the dates, and save the rows you want to keep in a list. You can then store those rows into a new csv file and delete the old one if you don't need it anymore.

Here's a snipped that does what you're asking for:

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]

Upvotes: 2

J. Owens
J. Owens

Reputation: 852

The datetime.datetime.strptime exception indicates you are passing a blank string to the function in row[0].

Once you get that issue resolved, you need to add code to write acceptable rows to a new file.

Upvotes: 2

alecxe
alecxe

Reputation: 474271

is_date() is giving you false positives. Be more strict when you check the date format and consistent when you load a date string into datetime - follow one of the principles of Zen of Python - "There should be one-- and preferably only one --obvious way to do it":

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

In other words, don't mix dateutil.parser.parse() and datetime.datetime.strptime().

Upvotes: 2

Related Questions