Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中优雅的数据处理_Python_Data Processing - Fatal编程技术网

Python中优雅的数据处理

Python中优雅的数据处理,python,data-processing,Python,Data Processing,我甚至不知道如何命名我的问题-我有一个python元组列表: (int, str, datetime, float) 这个列表中有很多行,它们是按日期时间排序的,我想计算在5分钟的时间跨度内有多少行,它们在给定的范围内有浮动,即从0到2,从2到5,从5到10等等。 我的意思是,给定这样的数据(date不是字符串,而是datetime.datetime): 我想收到一些字典: { the_end_of_time_interval1: {'0to2': int, '2to5': int, '5to

我甚至不知道如何命名我的问题-我有一个python元组列表:

(int, str, datetime, float)
这个列表中有很多行,它们是按日期时间排序的,我想计算在5分钟的时间跨度内有多少行,它们在给定的范围内有浮动,即从0到2,从2到5,从5到10等等。 我的意思是,给定这样的数据(date不是字符串,而是datetime.datetime):

我想收到一些字典:

{ the_end_of_time_interval1: {'0to2': int, '2to5': int, '5to10': int, ... },
  the_end_of_time_interval2: {'0to2': int, '2to5': int, '5to10': int, ... }, 
...}
例如:

{ '2014-09-10 17:52:34': { '0to2': 1, '2to5': 0, '5to10': 2, '10to15': 0 },
  '2014-09-10 17:59:54': { '0to2': 0, '2to5': 0, '5to10': 2, '10to15' : 0 } }
我的问题是——有什么优雅的方法可以做到这一点吗?我想将其保存到文件中,并将其发送到某个数据库进行监视。

您可以使用

itertools.groupby
您只需要使用函数进行分组/排序

一个能让你的约会井然有序的人:

the_date = None
def split_5_min(data_row):
    global the_date

    row_date = datetime.datetime.strptime(data_row[2], '%Y-%m-%d %H:%M:%S')
    if the_date is None or row_date - the_date > datetime.timedelta(minutes=5):
        the_date = row_date
        return the_date
这方面的东西应该可以做到

然后,您需要另一个将您的浮子放入桶中的浮子:

def bucket_floats(data_row):
    float_data = data_row[3]
    if float_data > 0 and float_data <= 2:
        return 1
    elif float_data > 2 and float_data <= 5:
        return 2
    elif float_data > 5 and float_data <= 10:
        return 3
    ...

我想这里的约会时间可能已经结束了。。。你可能想要更复杂的东西。或者在运行slit_5_min函数之前直接对日期进行排序

一些建议可以帮助您开始:您可以使用itertools.groupby将所有元素划分为组,其中所有元素都在第一个元素的5分钟内(或者在第一个元素向下舍入的5分钟内,我不确定您想要什么)。然后,在每个组中,可以使用sorted再次按浮点值和groupby进行排序,也可以显式循环并根据浮点的范围递增计数器值。如果您不理解其中的一部分,或者尝试了一下,发现有什么地方卡住了,您可以编写一个更具体的问题。或者,如果您打算将此问题存储在数据库中,并且该数据库将是关系数据库,您可以以类似的方式使用SQL GROUPBY和聚合函数。或者,您可以将Pandas与其分组和聚合函数一起使用。或者,当然,您可以围绕一个非常简单的状态机编写一个显式循环(当您达到5分钟边界时,输出当前计数器并启动一个新计数器)。我没有访问该数据库的权限,我只需要聚合一些有趣的数据并将其插入其中。非常感谢。但是在第行:data.sort(key=split_5_min)中,我得到了一个错误:TypeError:unorderable types:NoneType()datetime.timedelta(minutes=5):如果你愿意,你可以把它分成两个if,看看效果是否更好
def bucket_floats(data_row):
    float_data = data_row[3]
    if float_data > 0 and float_data <= 2:
        return 1
    elif float_data > 2 and float_data <= 5:
        return 2
    elif float_data > 5 and float_data <= 10:
        return 3
    ...
final_dict = {}

# always sort as groupby creates group each time the group value changes
data.sort(key=split_5_min)
for period, data_tuples in itertools.groupby(data, split_5_min):
    group_data = list(data_tuples)
    # sort again
    group_data.sort(key=bucket_floats)
    final_dict[period] = {}
    # do another grouping witin 5 min group
    for bucket, float_tuples in itertools.groupby(data, bucket_floats):
        # pack into a dict
        final_dict[period][bucket] = len(list(float_tuples))