获取Numpy genfromtxt转换器以使用def功能

时间:2013-04-05 18:07:08

标签: python numpy genfromtxt

我在论坛中搜索过,似乎无法解决以下问题。我对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})

1 个答案:

答案 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日?),需要更多关注。请务必阅读dayfirstyearfirst参数,以便控制解析器的行为。