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

Pythontology

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

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

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

我已经附上了在一些示例数据上运行我的方法的示例。是否有更好的方法以更好的性能实现相同的结果?人们也对使用更好的框架的建议表示赞赏(例如,最好是使用numpy数组来完成此操作,还是完全放弃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))
约翰泰尔索尔

由于数据已排序,因此您可以作弊并使用非常有用的bisect模块。而不是做整个数据列表的线性搜索,它会检查的中间值,则需要向左或向右半-一个很多更少的比较。如果输出数据正确,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)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

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

来自分类Dev

如何获取特定日期最早时间的数据?

来自分类Dev

获取特定日期范围的月份名称

来自分类Dev

在特定日期和时间之后获取数据,但日期和时间在SQL Server的不同列中

来自分类Dev

查询特定日期或范围月份(不含日期时间)的Mongodb

来自分类Dev

如何制作一个范围内特定日期时间数据的临时表?

来自分类Dev

特定日期获取数据的公式

来自分类Dev

使用JavaScript获取日期范围内的特定日期

来自分类Dev

AntD React:在DateRangePicker中禁用特定日期的时间范围

来自分类Dev

如何获取熊猫数据框中特定日期/时间的所有历史值?

来自分类Dev

获取特定日期范围内的结果

来自分类Dev

从特定日期范围获取页面消息 - Facebook Opengraph API

来自分类Dev

无法获取在特定日期范围内创建的工件

来自分类Dev

计算距特定日期和数据范围的天数

来自分类Dev

查询Laravel 4中特定日期范围的数据记录

来自分类Dev

如何检索特定日期范围内的数据?

来自分类Dev

为熊猫中的特定日期范围过滤数据框

来自分类Dev

使用基于集合的方法获取给定日期范围之间的特定日期

来自分类Dev

如何动态传递日期以获取特定日期的数据?

来自分类Dev

获取飞镖中特定日期的开始时间

来自分类Dev

如何从PostgreSQL的特定日期获取特定数据?

来自分类Dev

如何备份特定日期和时间的mysql中的数据?

来自分类Dev

从数据库中获取特定日期范围内的FullCalender.io事件对象(JSON)

来自分类Dev

没有获取特定日期的所有数据

来自分类Dev

Oracle数据库获取特定日期之间的值

来自分类Dev

如何根据特定日期获取所有数据?

来自分类Dev

如何计算日期范围内的特定日期和时间

来自分类Dev

在特定日期和时间范围内销售特定的 Woocommerce 商品

来自分类Dev

如何在特定日期的特定时间范围内显示不同的消息

Related 相关文章

  1. 1

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

  2. 2

    如何获取特定日期最早时间的数据?

  3. 3

    获取特定日期范围的月份名称

  4. 4

    在特定日期和时间之后获取数据,但日期和时间在SQL Server的不同列中

  5. 5

    查询特定日期或范围月份(不含日期时间)的Mongodb

  6. 6

    如何制作一个范围内特定日期时间数据的临时表?

  7. 7

    特定日期获取数据的公式

  8. 8

    使用JavaScript获取日期范围内的特定日期

  9. 9

    AntD React:在DateRangePicker中禁用特定日期的时间范围

  10. 10

    如何获取熊猫数据框中特定日期/时间的所有历史值?

  11. 11

    获取特定日期范围内的结果

  12. 12

    从特定日期范围获取页面消息 - Facebook Opengraph API

  13. 13

    无法获取在特定日期范围内创建的工件

  14. 14

    计算距特定日期和数据范围的天数

  15. 15

    查询Laravel 4中特定日期范围的数据记录

  16. 16

    如何检索特定日期范围内的数据?

  17. 17

    为熊猫中的特定日期范围过滤数据框

  18. 18

    使用基于集合的方法获取给定日期范围之间的特定日期

  19. 19

    如何动态传递日期以获取特定日期的数据?

  20. 20

    获取飞镖中特定日期的开始时间

  21. 21

    如何从PostgreSQL的特定日期获取特定数据?

  22. 22

    如何备份特定日期和时间的mysql中的数据?

  23. 23

    从数据库中获取特定日期范围内的FullCalender.io事件对象(JSON)

  24. 24

    没有获取特定日期的所有数据

  25. 25

    Oracle数据库获取特定日期之间的值

  26. 26

    如何根据特定日期获取所有数据?

  27. 27

    如何计算日期范围内的特定日期和时间

  28. 28

    在特定日期和时间范围内销售特定的 Woocommerce 商品

  29. 29

    如何在特定日期的特定时间范围内显示不同的消息

热门标签

归档