Python 从特定日期时间范围获取数据

Python 从特定日期时间范围获取数据,python,datetime,Python,Datetime,我正在尝试编写一个进行时间序列分析的web应用程序 我用Python编写了一个函数,用于获取属于给定日期时间范围(使用Python的datetime.datetime类)的数据集子集(Python dict) 在我的web应用程序中,我正在进行一次计算,调用此函数数百次,以对大约10000个点的数据集进行选择。这大约需要25秒,这是可以的,但并不理想 我附上了一个在一些样本数据上运行的方法示例。是否有更好的方法以更好的性能实现相同的结果?对于更好地使用框架的建议也表示赞赏(例如,使用numpya

我正在尝试编写一个进行时间序列分析的web应用程序

我用Python编写了一个函数,用于获取属于给定日期时间范围(使用Python的datetime.datetime类)的数据集子集(Python dict)

在我的web应用程序中,我正在进行一次计算,调用此函数数百次,以对大约10000个点的数据集进行选择。这大约需要25秒,这是可以的,但并不理想

我附上了一个在一些样本数据上运行的方法示例。是否有更好的方法以更好的性能实现相同的结果?对于更好地使用框架的建议也表示赞赏(例如,使用
numpy
array还是完全放弃Python更好?)

该函数输出经过的时间量

from datetime import datetime
from datetime import timedelta

data_dict = {'times':[], 'data':[]}

#Generate sample data
start_datetime = datetime(2014, 8, 23, 15, 17, 17, 392943)
for i in range(10000):
    data_dict['times'].append(start_datetime+timedelta(minutes = 5*i))
    data_dict['data'].append(i)

startTime = datetime.now()

def data_select(data_dict, time_range):
    start = 0
    end = 1
    for x in data_dict['times']:
        if x - time_range[0] < timedelta(seconds = 0):
            start += 1
        if x - time_range[1] <= timedelta(seconds = 0):
            end += 1
    data_dict['times'] = list(data_dict['times'][start:end])
    data_dict['data'] = list(data_dict['data'][start:end])
    return data_dict

#Example function call   
data_sub_dict = data_select(data_dict, [datetime(2014, 8, 30, 0, 0, 0, 0), datetime(2014, 9, 5, 0, 0, 0, 0)])

print "Time elapsed: " + str((datetime.now() - startTime))
从日期时间导入日期时间
从日期时间导入时间增量
data_dict={'times':[],'data':[]
#生成样本数据
start_datetime=datetime(2014,8,23,15,17,173943)
对于范围(10000)内的i:
数据记录['times'].append(开始日期时间+时间增量(分钟=5*i))
数据目录[数据].附加(i)
startTime=datetime.now()
def数据选择(数据记录、时间范围):
开始=0
结束=1
对于数据目录中的x[‘时间’]:
如果x-时间范围[0]<时间增量(秒=0):
开始+=1

如果x-time_range[1]自数据排序以来,您可以作弊并使用非常有用的模块。它不是在数据列表中进行线性搜索,而是检查中间值,然后取左半部或右半部——比较要少得多。如果输出数据正确,
bisect
对于10k数据点大约快800倍

来源
import bisect
from datetime import datetime
from datetime import timedelta

data_dict = {'times':[], 'data':[]}

#Generate sample data
start_datetime = datetime(2014, 8, 23, 15, 17, 17, 392943)
for i in range(10000):
    data_dict['times'].append(start_datetime+timedelta(minutes = 5*i))
    data_dict['data'].append(i)

startTime = datetime.now()

def data_select_search(data_dict, time_range):
    start = 0
    end = 1
    times = data_dict['times']
    for x in times:
        if x - time_range[0] < timedelta(seconds = 0):
            start += 1
        if x - time_range[1] <= timedelta(seconds = 0):
            end += 1
    # print 'search:',start,end
    data_dict['times'] = list(data_dict['times'][start:end])
    data_dict['data'] = list(data_dict['data'][start:end])
    return data_dict

def data_select_bisect(data_dict, time_range):
    times = data_dict['times']
    start = bisect.bisect_left(times, time_range[0])
    end = bisect.bisect_right(times, time_range[1], lo=start) + 1
    # print 'bisect:',start,end
    return dict(
        times=data_dict['times'][start:end],
        data=data_dict['data'][start:end],
        )

drange = [
        datetime(2014, 8, 30, 0, 0, 0, 0), 
        datetime(2014, 9, 5, 0, 0, 0, 0)
    ]
data_sub_dict = data_select_search(data_dict.copy(), drange)
_dict2 = data_select_bisect(data_dict.copy(), drange)

import timeit
mysetup = "from __main__ import data_select_bisect, data_select_search, data_dict, drange"
num = 100

print('search:', timeit.timeit(
    "data_select_search(data_dict.copy(), drange)", 
    setup=mysetup,
    number=num
    ))
print('bisect:', timeit.timeit(
    "data_select_bisect(data_dict.copy(), drange)", 
    setup=mysetup,
    number=num,
    ))
('search:', 1.2735650539398193)
('bisect:', 0.0015599727630615234)