python从csv获取数据类型-日期时间和时间为;2305“;
如何从csv文件中获取datetime和time的数据类型: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"
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
不是有效的strtime指令,我猜您的意思是%D
%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之后的整数?捕获异常并忽略它是一个糟糕、糟糕、糟糕的主意,除非您确切知道导致该异常的原因,并且您确定可以忽略它。当您请求调试代码时,请始终包含所有错误的完整堆栈跟踪。