python pandas 日期_Python Pandas:创建日期时间索引的最快方法是什么?

快速回答是,您指出将日期/时间字符串解析为日期时间类型索引的最快方法确实是最快的方法.我计划了一些你的方法和其他一些方法,这就是我得到的.

首先,获取一个示例DataFrame来使用:

import datetime

from pandas import *

start = datetime(2000, 1, 1)

end = datetime(2012, 12, 1)

d = DateRange(start, end, offset=datetools.Hour())

t_df = DataFrame({'field_1': np.array(['OFF', 'ON'])[np.random.random_integers(0, 1, d.size)], 'field_2': np.random.random_integers(0, 1, d.size)}, index=d)

哪里:

In [1]: t_df.head()

Out[1]:

field_1 field_2

2000-01-01 00:00:00 ON 1

2000-01-01 01:00:00 OFF 0

2000-01-01 02:00:00 OFF 1

2000-01-01 03:00:00 OFF 1

2000-01-01 04:00:00 ON 1

In [2]: t_df.shape

Out[2]: (113233, 2)

这是一个约.如果将其转储到磁盘上,则为3.2MB文件.我们现在需要删除索引的DataRange类型并将其作为str的列表来模拟您将如何解析数据:

t_df.index = t_df.index.map(str)

如果您在使用read_table将数据读入DataFrame时使用parse_dates = True,那么您将看到9.5秒的平均分析时间:

In [3]: import numpy as np

In [4]: import timeit

In [5]: t_df.to_csv('data.tsv', sep='\t', index_label='date_time')

In [6]: t = timeit.Timer("from __main__ import read_table; read_table('data.tsv', sep='\t', index_col=0, parse_dates=True)")

In [7]: np.mean(t.repeat(10, number=1))

Out[7]: 9.5226533889770515

其他策略依赖于首先将数据解析为DataFrame(可忽略的解析时间),然后将索引转换为datetime对象的索引:

In [8]: t = timeit.Timer("from __main__ import t_df, dateutil; map(dateutil.parser.parse, t_df.index.values)")

In [9]: np.mean(t.repeat(10, number=1))

Out[9]: 7.6590064525604244

In [10]: t = timeit.Timer("from __main__ import t_df, dateutil; t_df.index.map(dateutil.parser.parse)")

In [11]: np.mean(t.repeat(10, number=1))

Out[11]: 7.8106775999069216

In [12]: t = timeit.Timer("from __main__ import t_df, datetime; t_df.index.map(lambda x: datetime.strptime(x, \"%Y-%m-%d %H:%M:%S\"))")

Out[12]: 2.0389052629470825

In [13]: t = timeit.Timer("from __main__ import t_df, np; map(np.datetime_, t_df.index.values)")

In [14]: np.mean(t.repeat(10, number=1))

Out[14]: 3.8656840562820434

In [15]: t = timeit.Timer("from __main__ import t_df, np; map(np.datetime64, t_df.index.values)")

In [16]: np.mean(t.repeat(10, number=1))

Out[16]: 3.9244711160659791

现在为获胜者:

In [17]: def f(s):

....: return datetime(int(s[0:4]),

....: int(s[5:7]),

....: int(s[8:10]),

....: int(s[11:13]),

....: int(s[14:16]),

....: int(s[17:19]))

....: t = timeit.Timer("from __main__ import t_df, f; t_df.index.map(f)")

....:

In [18]: np.mean(t.repeat(10, number=1))

Out[18]: 0.33927145004272463

使用numpy,pandas或datetime-type方法时,肯定可能会有更多的优化思路,但在我看来,保留CPython的标准库并将每个日期/时间str转换为一个intt的tupple并转换为一个datetime实例得到你想要的最快的方法.

你可能感兴趣的:(python,pandas,日期)