我在论坛中搜索过,似乎无法解决以下问题。我对python很新,只有一点编程经验,所以我的问题可能很简单。
想要使用date.strptime
classmethod将日期时间字符串转换为日期时间格式。
问题是列中的字符串格式是不一致(多数是%Y-%m-%d $H:$M:$S.%f
);当时间精确地落在第二个时,省略毫秒小数(格式应该是%Y-%m-%d $H:$M:$S
)。当strptime
遇到无法识别的格式时,它只会在数组元素中放置None
值。
有没有办法在lambda
函数中创建例外(即ValueError
例外),如果没有,我如何将字符串值传递给“普通”def timeConv(x)
函数来自genfromtxt
转换器选项?
也许有更好的方法来解决这个问题......?
我的当前代码,当格式为None
时会产生%Y-%m-%d $H:$M:$S
值:
timeConv = lambda x: datetime.strptime(x, '\"%Y-%m-%d $H:$M:$S.%f\"')
Time = np.genfromtxt(file, dtype='object', delimiter=',', skip_header=4, usecols=(0), converters = {0: timeConv})
答案 0 :(得分:4)
您可以使用try..except
首先尝试一种格式,如果它不起作用,请捕获异常并尝试其他格式:
import datetime as DT
import numpy as np
def timeConv(x):
try:
return DT.datetime.strptime(x, '%Y-%m-%d %H:%M:%S.%f')
except ValueError as err:
return DT.datetime.strptime(x, '%Y-%m-%d %H:%M:%S')
time = np.genfromtxt(file, dtype='object', delimiter=',', skip_header=4,
usecols=(0), converters = {0: timeConv})
函数timeConv
传递给genfromtxt
的方式与传递lambda
的方式相同。
dateutil module有一个日期字符串解析器,不需要您指定日期字符串的确切格式。所以使用dateutil你可以简单地写
import dateutil.parser as dparser
import numpy as np
time = np.genfromtxt(file, dtype='object', delimiter=',', skip_header=4,
usecols=(0), converters = {0: dparser.parse})
请注意,虽然dparser.parse
非常容易使用,但有一些含糊不清的日期字符串,例如2013-8-9
(8月8日或9月9日?),需要更多关注。请务必阅读dayfirst
和yearfirst
参数,以便控制解析器的行为。