2

我搜索了论坛,似乎无法解决以下问题。我对 python 很陌生,有一点编程经验,所以我的问题可能是微不足道的。

希望使用类方法将日期时间字符串转换为日期时间格式date.strptime

问题是列内的字符串格式不一致(大部分是%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})
4

1 回答 1

4

您可以使用 atry..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})

该函数timeConvgenfromtxt与传递lambda.


dateutil模块有一个日期字符串解析器,它不需要您指定日期字符串的确切格式。所以使用 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(August 8 或 Sept 9?),需要更加小心。请务必阅读dayfirstyearfirst参数,以便您可以控制解析器的行为。

于 2013-04-05T18:11:17.640 回答