我有包含表示ISO格式日期的字符串列表的数据文件.目前,我正在阅读他们使用:
mydates = [ datetime.datetime.strptime(timdata[x], "%Y-%m-%dT%H:%M:%S") for x in range(len(timedata)) ]
Run Code Online (Sandbox Code Playgroud)
这看起来非常简单,但是在大约25000个日期的大型列表上运行时速度非常慢 - >每个转换列表大约0.34秒.由于我有数千个此类列表,我正在寻找更快的方法.但是,我还没找到.dateutil解析器的性能更差......
NPE*_*NPE 18
这是一种快速提高3倍的方法.
原始版本:
In [23]: %timeit datetime.datetime.strptime("2013-01-01T01:23:45", "%Y-%m-%dT%H:%M:%S")
10000 loops, best of 3: 21.8 us per loop
Run Code Online (Sandbox Code Playgroud)
更快的版本:
In [24]: p = re.compile('[-T:]')
In [26]: %timeit datetime.datetime(*map(int, p.split("2013-01-01T01:23:45")))
100000 loops, best of 3: 7.28 us per loop
Run Code Online (Sandbox Code Playgroud)
这显然远没有那么灵活strptime().
编辑:使用单个正则表达式提取日期组件的速度稍快:
In [48]: pp = re.compile(r'(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})')
In [49]: %timeit datetime.datetime(*map(int, pp.match("2013-01-01T01:23:45").groups()))
100000 loops, best of 3: 6.92 us per loop
Run Code Online (Sandbox Code Playgroud)
bmu*_*bmu 10
索引/切片似乎比@NPE使用的正则表达式更快:
In [47]: def with_indexing(dstr):
....: return datetime.datetime(*map(int, [dstr[:4], dstr[5:7], dstr[8:10],
....: dstr[11:13], dstr[14:16], dstr[17:]]))
In [48]: p = re.compile('[-T:]')
In [49]: def with_regex(dt_str):
....: return datetime.datetime(*map(int, p.split(dt_str)))
In [50]: %timeit with_regex(dstr)
100000 loops, best of 3: 3.84 us per loop
In [51]: %timeit with_indexing(dstr)
100000 loops, best of 3: 2.98 us per loop
Run Code Online (Sandbox Code Playgroud)
我想如果您使用文件解析器numpy.genfromtxt,converters参数和快速字符串解析方法,您可以在不到半秒的时间内读取和解析整个文件.
我使用以下函数创建一个大约25000行的示例文件,ISO日期字符串作为索引和10个数据列:
import numpy as np
import pandas as pd
def create_data():
# create dates
dates = pd.date_range('2010-01-01T00:30', '2013-01-04T23:30', freq='H')
# convert to iso
iso_dates = dates.map(lambda x: x.strftime('%Y-%m-%dT%H:%M:%S'))
# create data
data = pd.DataFrame(np.random.random((iso_dates.size, 10)) * 100,
index=iso_dates)
# write to file
data.to_csv('dates.csv', header=False)
Run Code Online (Sandbox Code Playgroud)
比我使用以下代码来解析文件:
In [54]: %timeit a = np.genfromtxt('dates.csv', delimiter=',',
converters={0:with_regex})
1 loops, best of 3: 430 ms per loop
In [55]: %timeit a = np.genfromtxt('dates.csv', delimiter=',',
converters={0:with_indexing})
1 loops, best of 3: 391 ms per loop
Run Code Online (Sandbox Code Playgroud)
pandas(基于numpy)有一个基于C的文件解析器,它更快:
In [56]: %timeit df = pd.read_csv('dates.csv', header=None, index_col=0,
parse_dates=True, date_parser=with_indexing)
10 loops, best of 3: 167 ms per loop
Run Code Online (Sandbox Code Playgroud)