【问题标题】:Get Numpy genfromtxt converter to use def function获取 Numpy genfromtxt 转换器以使用 def 函数
【发布时间】:2013-03-28 06:18:59
【问题描述】:

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

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

问题是列内的字符串格式不一致(大部分是%Y-%m-%d $H:$M:$S.%f);当时间正好落在秒上时,毫秒小数将被省略(格式应改为%Y-%m-%d $H:$M:$S)。当strptime 遇到无法识别的格式时,它会简单地将None 值放入数组元素中。

有没有办法在lambda 函数中创建异常(即ValueError 异常),如果没有,我如何将字符串值从genfromtxt 传递到“正常”def timeConv(x) 函数中转换器选项?

也许有更好的方法来解决这个问题...?

当格​​式为 %Y-%m-%d $H:$M:$S 时,我当前的代码会生成 None 值:

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})

【问题讨论】:

  • fyi,f = lambda x, y: <do things with x, y>def f(x, y): <do things with x, y> 相同,并且都将名称 f 赋予函数 <...>

标签: python numpy genfromtxt


【解决方案1】:

您可以使用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 参数,以便控制解析器的行为。

【讨论】:

  • 非常感谢!代码的第一部分就像一个魅力。另外,感谢您让我知道 dateutil.parser,我不知道它的存在。干杯-A
猜你喜欢
  • 2014-05-23
  • 2019-04-08
  • 1970-01-01
  • 2017-03-18
  • 1970-01-01
  • 2021-03-12
  • 1970-01-01
  • 1970-01-01
  • 2020-08-10
相关资源
最近更新 更多