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