ValueError:时间数据''与格式不匹配'%d-%m-%Y%H:%M:%S'

时间:2016-06-14 16:26:09

标签: python csv datetime

我想做的是:

  
      
  1. 删除csv日期低于25.05.2016 23:59
  2. 的所有行   
  3. 使用其他名称保存文件
  4.   

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

如果条件为真,我怎样才能删除该行,最后用不同的名称保存?

4 个答案:

答案 0 :(得分:2)

is_date()正在为您提供误报。在检查日期格式时要更加严格,并且在将日期字符串加载到datetime时保持一致 - 遵循Zen of Python - &#34的原则之一;应该有一个 - 最好只有一个 - 显而易见的方式&#34;:

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:2)

您可以分析每一行以比较日期,并将要保留的行保存在<?php require_once "inc.php"; $array = array(); // Let's store our shoutcast variables into an array. $array['host'] = "xxx.xxx.xx.xxx"; // Your Shoutcast Host $array['port'] = "xxxx"; // Your Shoutcast Port $array['extra'] = "/admin.cgi?sid=1&mode=viewxml&page=1"; // The bit that follows in the url to access the xml of the stats $array['user'] = "xxxxx"; // Admin username (Default is usually "admin") $array['password'] = "xxxxxxx"; // Admin Password $radioStats = new radioStats( $array['host'], $array['port'], $array['extra'], $array['user'], $array['password']); $returnStats = $radioStats->returnStats(); $song = $returnStats['currentSong']; ?> <div align="center"> <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"> </script> <link href="votingfiles/voting.css" rel="stylesheet" type="text/css" /> <script src="votingfiles/voting.js" type="text/javascript"></script> <script> $(document).ready(function(){ setInterval(function(){cache_clear()},54000); }); function cache_clear() { window.location.reload(true); } </script> <div id="radio_stats"> <?php if( $returnStats['serverStatus'] != 0 ) { ?> <?php if( $returnStats['currentSong'] != "" ) { echo $returnStats['currentSong']; } else { echo "Undefined"; } ?></div> <br /><br /> <div class="vot_updown1" id="vt_$song"></div> <?php } else { ?> This radio server appears to be offline. <?php } ?>中。然后,您可以将这些行存储到新的csv文件中,如果您不再需要,则删除旧的。

这是一个剪辑,可以满足您的要求:

list

答案 3 :(得分: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函数的实现方式,你应该把你的日期时间创建放到一个处理错误的函数中。这是我通常的模式:

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