【问题标题】:Python datetime formatted string to datetime objectPython datetime 格式化字符串到 datetime 对象
【发布时间】:2015-12-02 18:54:29
【问题描述】:

我有一系列 CSV,其中有一列包含 Python datetime 格式的字符串。在解析 CSV 文件(可能有数万行长)时,我希望将日期列从字符串转换为实际的 datetime 对象。

CSV 行示例:

['0', '(2011, 12, 11, 15, 45, 20)', 'Arduino/libraries/dallas-temperature-control/'],

如您所见,日期在 CSV 中以 datetime 格式表示,但作为字符串表示。

我正在寻找一种快速的方法来构建datetime 对象,而无需通过datetime.strptime(row[1], "(%Y, %m, %d, %H, %M, %S)") 运行它——当它准备好时,必须用strptime 解释日期似乎是违反直觉的——是。

【问题讨论】:

  • 您可以将ast.literal_eval 字符串转换为整数元组,然后将其直接解压缩到datetime 构造函数中:datetime.datetime(*literal_eval(row[1]))
  • 这是pandas吗?以更容易解析的格式存储 str 也没有意义?
  • @EdChum - CSV 输出直接来自 ZipFile.infolist(),因此目前没有中间解释器。
  • 非常感谢@jonrsharpe。您要添加它作为答案以便我接受吗?

标签: python csv datetime


【解决方案1】:

就像@jonrhsarpe 在他的回答中所说,您可以使用ast.literal_eval 将字符串转换为元组,然后将其解包到字符串中。

但根据以下测试,似乎更快的方法仍然是使用datetime.datetime.strptime()。示例 -

代码-

import datetime
import ast

def func1(datestring):
    return datetime.datetime(*ast.literal_eval(datestring))

def func2(datestring):
    return datetime.datetime.strptime(datestring, '(%Y, %m, %d, %H, %M, %S)')

时间信息-

In [39]: %timeit func1("(2011, 12, 11, 15, 45, 20)")
10000 loops, best of 3: 30.1 µs per loop

In [40]: %timeit func2("(2011, 12, 11, 15, 45, 20)")
10000 loops, best of 3: 26.9 µs per loop

In [41]: %timeit func1("(2011, 12, 11, 15, 45, 20)")
10000 loops, best of 3: 38.6 µs per loop

In [42]: %timeit func2("(2011, 12, 11, 15, 45, 20)")
10000 loops, best of 3: 28.8 µs per loop

In [43]: %timeit func1("(2011, 12, 11, 15, 45, 20)")
10000 loops, best of 3: 31.2 µs per loop

In [44]: %timeit func2("(2011, 12, 11, 15, 45, 20)")
10000 loops, best of 3: 29.5 µs per loop

In [45]: %timeit func1("(2011, 12, 11, 15, 45, 20)")
The slowest run took 5.51 times longer than the fastest. This could mean that an intermediate result is being cached
10000 loops, best of 3: 32.6 µs per loop

In [46]: %timeit func2("(2011, 12, 11, 15, 45, 20)")
The slowest run took 15.42 times longer than the fastest. This could mean that an intermediate result is being cached
10000 loops, best of 3: 27.5 µs per loop

In [47]: %timeit func1("(2011, 12, 11, 15, 45, 20)")
10000 loops, best of 3: 49.2 µs per loop

In [48]: %timeit func2("(2011, 12, 11, 15, 45, 20)")
10000 loops, best of 3: 24.4 µs per loop

不确定,您从哪里得到datetime.datetime.strptime() 违反直觉的信息,但我想说,如果要将字符串解析为日期时间对象,您应该使用strptime()

【讨论】:

  • 很好的答案,但为什么不直接计时实际字符串 -> 日期时间位,而不是使用 CSV 文件使事情复杂化?
  • 好建议,会这样做。谢谢。
  • 非常有趣的见解阿南德,谢谢。虽然小文件的收益微乎其微,但当您获得更大的列表时,这种洞察力可能会带来很大的优化收益。
【解决方案2】:

您可以使用ast.literal_eval 将字符串转换为整数元组:

>>> import ast
>>> ast.literal_eval('(2011, 12, 11, 15, 45, 20)')
(2011, 12, 11, 15, 45, 20)

然后您可以直接将其解包(参见 What does ** (double star) and * (star) do for parameters?)到 datetime 构造函数中:

>>> import datetime
>>> datetime.datetime(*ast.literal_eval('(2011, 12, 11, 15, 45, 20)'))
datetime.datetime(2011, 12, 11, 15, 45, 20)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 2014-11-30
    相关资源
    最近更新 更多