python从csv获取数据类型-日期时间和时间为;2305“;

python从csv获取数据类型-日期时间和时间为;2305“;,python,datetime,Python,Datetime,如何从csv文件中获取datetime和time的数据类型: with open(dataPath, newline='') as csvData: reader = csv.DictReader(csvData, delimiter=';') head = next(reader) . . "...."; "YEAR"

如何从csv文件中获取datetime和time的数据类型:

        with open(dataPath, newline='') as csvData:
             reader = csv.DictReader(csvData, delimiter=';')
             head = next(reader)
             .
             .
        "...."; "YEAR"; "TIME"; "..." --> head
        "...."; "19.05.2020"; "0050"; "..." --> "0050" means 00:50
        "...."; "12.05.2020"; "2035"; "..." --> "2035" means 20:35
我有以下csv文件:

        with open(dataPath, newline='') as csvData:
             reader = csv.DictReader(csvData, delimiter=';')
             head = next(reader)
             .
             .
        "...."; "YEAR"; "TIME"; "..." --> head
        "...."; "19.05.2020"; "0050"; "..." --> "0050" means 00:50
        "...."; "12.05.2020"; "2035"; "..." --> "2035" means 20:35
我尝试了一个函数:

def convert(value):
    heuristics = [lambda value: datetime.strptime(value, "%d.%m.%Y"), datetime.strptime(value, "%H%D"), int, float]
    for type in heuristics:
        try:
            return type(value)
        except ValueError:
            continue
    # All other heuristics failed it is a string
    return value
如果我有一个值“[1,2,3]”,它将输出一个valueerror,但为此我编写了valueerror除外:continue,为什么在发生此错误时它不继续,与“513165”相同


谢谢

如果您想让此功能正常运行,请注意以下几点:

  • 两个strtime操作都需要
    lambda
  • %D
    不是有效的strtime指令,我猜您的意思是
    %M
  • 不要重新定义内置的
    类型
  • 最好捕获并打印错误,以了解发生了什么
使用一些测试的工作示例(但不要假设所有可能的错误都覆盖了…)

给你

testing '2355'...
encountered error: time data '2355' does not match format '%d.%m.%Y'
1900-01-01 23:55:00 <class 'datetime.datetime'>
testing 'asdf'...
encountered error: time data 'asdf' does not match format '%d.%m.%Y'
encountered error: time data 'asdf' does not match format '%H%M'
encountered error: invalid literal for int() with base 10: 'asdf'
encountered error: could not convert string to float: 'asdf'
asdf <class 'str'>
testing '12'...
encountered error: time data '12' does not match format '%d.%m.%Y'
1900-01-01 01:02:00 <class 'datetime.datetime'>
testing '3.14'...
encountered error: time data '3.14' does not match format '%d.%m.%Y'
encountered error: time data '3.14' does not match format '%H%M'
encountered error: invalid literal for int() with base 10: '3.14'
3.14 <class 'float'>
testing '7.12.2013'...
2013-12-07 00:00:00 <class 'datetime.datetime'>
测试“2355”。。。
遇到错误:时间数据“2355”与格式“%d.%m.%Y”不匹配
1900-01-01 23:55:00 
正在测试“asdf”。。。
遇到错误:时间数据“asdf”与格式“%d.%m.%Y”不匹配
遇到错误:时间数据“asdf”与格式“%H%M”不匹配
遇到错误:基数为10的int()的文本无效:“asdf”
遇到错误:无法将字符串转换为浮点:“asdf”
asdf
测试“12”。。。
遇到错误:时间数据“12”与格式“%d.%m.%Y”不匹配
1900-01-01 01:02:00 
测试“3.14”。。。
遇到错误:时间数据“3.14”与格式“%d.%m.%Y”不匹配
遇到错误:时间数据“3.14”与格式“%H%M”不匹配
遇到错误:基数为10的int()的文本无效:“3.14”
3.14
测试“7.12.2013”。。。
2013-12-07 00:00:00 

如果您知道列的格式(例如“%H%M”),为什么不直接解析它,为什么不使用复杂的函数?为什么不只是一个try/except,如果有多个格式,它会尝试不同的格式呢?因为我想在最后自动完成任务,并且它应该使用函数convert()自动找到正确的数据类型
convert()如何
函数区分
2035
=8:35pm和
2035
=2034之后的整数?捕获异常并忽略它是一个糟糕、糟糕、糟糕的主意,除非您确切知道导致该异常的原因,并且您确定可以忽略它。当您请求调试代码时,请始终包含所有错误的完整堆栈跟踪。