Python日期时间格式化字符串转换为日期时间对象

4

我有一系列包含Python datetime格式字符串的CSV文件。在解析这些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解释日期似乎是违反直觉的。

2
你可以使用 ast.literal_eval 将字符串转换为整数元组,然后将其直接解包到 datetime 构造函数中:datetime.datetime(*literal_eval(row[1])) - jonrsharpe
这是 pandas 吗?另外,将字符串存储在更易于解析的格式中是否更有意义? - EdChum
@EdChum - CSV 输出直接来自于 ZipFile.infolist(),因此目前没有中间解释器。 - Karl M.W.
2
非常感谢@jonrsharpe。你想把它作为答案添加,这样我就可以接受它了吗? - Karl M.W.
2个回答

4
你可以使用 ast.literal_eval 将字符串转换为整数元组:
>>> import ast
>>> ast.literal_eval('(2011, 12, 11, 15, 45, 20)')
(2011, 12, 11, 15, 45, 20)

你可以将此内容解包(参见例如什么是**(双星号)和*(星号)用于参数?),然后直接输入datetime构造函数:
>>> import datetime
>>> datetime.datetime(*ast.literal_eval('(2011, 12, 11, 15, 45, 20)'))
datetime.datetime(2011, 12, 11, 15, 45, 20)

4

如@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()


1
不错的答案,但为什么不直接计时实际的字符串->日期时间转换过程,而要用CSV文件来增加复杂性呢? - jonrsharpe
好的建议,会这样做的。谢谢。 - Anand S Kumar
非常有趣的见解,Anand,谢谢你。虽然在小文件上的边际收益微不足道,但当你处理更大的列表时,这种见解可能会带来巨大的优化收益。 - Karl M.W.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接