Python 在datetime.date对象的numpy数组中搜索日期的更快方法?

Python 在datetime.date对象的numpy数组中搜索日期的更快方法?,python,search,datetime,numpy,Python,Search,Datetime,Numpy,我有一个按时间顺序排列的大型datetime.date对象数组。此数组中的许多日期相同,但是缺少一些日期。。。(这是一个“真实数据”的时间序列,所以很混乱) 我想计算每个日期有多少数据点,目前我是这样做的: import datetime as dt import numpy as np t = np.array([dt.date(2012,12,1) + dt.timedelta(n) for n in np.arange(0,31,0.25)]) Ndays = (t[-1] - t[0

我有一个按时间顺序排列的大型datetime.date对象数组。此数组中的许多日期相同,但是缺少一些日期。。。(这是一个“真实数据”的时间序列,所以很混乱)

我想计算每个日期有多少数据点,目前我是这样做的:

import datetime as dt
import numpy as np

t = np.array([dt.date(2012,12,1) + dt.timedelta(n) for n in np.arange(0,31,0.25)])

Ndays = (t[-1] - t[0]).days

data_per_day = np.array([sum(t == t[0] + dt.timedelta(d)) for d in xrange(Ndays)])

然而,我发现这是非常缓慢的!(对于大约400000个数据点,超过10分钟)是否有更快的方法执行此操作?

对于3100000个条目,此操作在几秒钟内运行

import datetime as dt
import numpy as np
from collections import Counter

t = np.array([dt.date(2012,12,1) + dt.timedelta(n) for n in np.arange(0,31,0.00001)])

c = Counter(t)
print c

下面是一个基于检测唯一日期之间距离的解决方案

# Get the unique day indexes of t
indexes = np.hstack(([-1], np.nonzero(np.diff(t))[0], [len(t)-1]))
# Determine how many data points are for that day
lengths = np.hstack(np.diff(indexes))

# Pull out the actual dates for the new days
dates = t[indexes[:-1] +1]
# Convert them to indexes (or day offsets)
as_int = np.vectorize(lambda d : d.day)(dates) -1

# Make a np array of these lengths
data_per_day = np.zeros((Ndays + 1,), np.int)
data_per_day[as_int] = lengths

使用
np.datetime64
。根据数据@Hans,我得到241毫秒

In [1]: import numpy as np

In [2]: import datetime as dt

In [3]: t = np.array([dt.date(2012,12,1) + dt.timedelta(n)
                        for n in np.arange(0,31,0.00001)])

In [4]: t = t.astype(np.datetime64)

In [5]: daterange = np.arange(t[0], t[-1], dtype='datetime64[D]')

In [6]: np.bincount(daterange.searchsorted(t))
Out[6]: 
array([100000, 100000, 100000, 100000, 100000, 100000, 100000, 100000,
       100000, 100000, 100000, 100000, 100000, 100000, 100000, 100000,
       100000, 100000, 100000, 100000, 100000, 100000, 100000, 100000,
       100000, 100000, 100000, 100000, 100000, 100000, 100000])

In [7]: %timeit np.bincount(daterange.searchsorted(t))
1 loops, best of 3: 241 ms per loop

可能对
timedelta
的调用正在减慢您的速度。考虑将<代码> d <代码>与<代码> Tele= T-T[0 ] < /代码>进行比较,这是以前计算的吗?当您有40万个日期时,
Ndays
有多大?不同建议解决方案的性能因您有多少天而有很大差异。对于400000个数据点,
Ndays
的het值是多少?
Ndays
的顺序为2000。下面@root的解决方案将速度提高了几个数量级。JesseC,出于好奇,你是否与我的方法进行了比较?好的,我刚刚尝试过,如果你包括转换数据类型的时间,@root的方法比我的方法慢14倍。如果你不数一数,那么他的方法比我的快4倍。(此测试在跨越
2000
天的
200000
日期进行。)使用numpy的速度有多快?因为对我来说,OP给出的方法处理这些数据只需要2-3秒,我没有检查。我只是想让大家看看柜台有多酷。使用numpy的datetime64是更好的解决方案,因此我将对此进行投票。这非常好。我认为你对真实数据的瓶颈将是调用
searchsorted
@Geoff——在不知道真实数据的特征的情况下,几乎不可能分辨出来……令人惊讶的是,谢谢,这大大加快了速度。唯一的小问题是,
daterange=np.arange(t[0],t[-1],dtype='datetime64[D]')
给了我以下错误:
TypeError:ufunc'true\u divide'不支持输入类型,并且无法根据强制转换规则“safe”
将输入安全地强制到任何支持的类型(但我找到了一个解决方法)@JesseC——
np.\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
说什么?也许您正在使用较旧版本的
numpy
。。。升级到最新版本应该可以解决这个问题。我的代码是
1.6.2
,并给出了这个错误。需要什么版本,root?