Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/304.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_Python 3.x_Pandas_Anaconda - Fatal编程技术网

Python 一周内发生事件的频率

Python 一周内发生事件的频率,python,python-3.x,pandas,anaconda,Python,Python 3.x,Pandas,Anaconda,我的数据包含带有日期时间信息、每个行程的用户id和行程类型(单次、往返、伪)的行程 下面是一个名为All_data的数据示例(pandas dataframe): HoraDTRetirada idpass type 2016-02-17 15:36:00 39579449489 'single' 2016-02-18 19:13:00 39579449489 '

我的数据包含带有日期时间信息、每个行程的用户id和行程类型(单次、往返、伪)的行程

下面是一个名为All_data的数据示例(pandas dataframe):

HoraDTRetirada        idpass        type                                             
2016-02-17 15:36:00  39579449489   'single'  
2016-02-18 19:13:00  39579449489   'single' 
2016-02-26 09:20:00  72986744521   'pseudo' 
2016-02-27 12:11:00  72986744521   'round'  
2016-02-27 14:55:00  11533148958   'pseudo'
2016-02-28 12:27:00  72986744521   'round'
2016-02-28 16:32:00  72986744521   'round'
我想计算一下用户在“一年中的一周”中每个类别重复的次数

例如,如果同一用户的事件发生在星期一,而下一个事件发生在星期四,则在同一周发生两个事件;但是,如果一个事件发生在星期六,下一个事件发生在下一个星期一,那么它们发生在不同的星期

我正在寻找的输出形式如下:

idpass        weekofyear   type      frequency
39579449489    1           'single'   2
72986744521    2           'round'    3
72986744521    2           'pseudo'   1
11533148958    2           'pseudo'   1

编辑:这是一个类似的问题,但我不知道如何处理熊猫。

我的建议是:

  • 确保您的时间戳为datetime并添加频率列

    df['horadretirada']=pd.to_datetime(df['horadretirada'])

    df['freq']=1

  • 分组数数

    res=df.groupby(['idpass','type',pd.Grouper(key='horadretirada',freq='1W'))).count().reset_index()

  • 将时间转换为一年中的一周

    res['HoratRetirada']=res['HoratRetirada'].应用(λx:x.周)

  • 最终结果如下所示:

    编辑:

    您是对的,在您的情况下,我们应该在第2步之前执行第3步,如果您想这样做,请记住groupby将发生更改,因此最后第2步将是:

    res['HoraDTRetirada'] = res['HoraDTRetirada'].apply(lambda x: x.week)
    
    步骤3:

    res = df.groupby(['idpass', 'type', 'HoraDTRetirada')]).count().reset_index()
    
    这有点不同,因为“Hora”变量不再是时间,而是一个表示一周的整数

    import pandas as pd
    
    data = {"HoraDTRetirada": ["2016-02-17 15:36:00", "2016-02-18 19:13:00", "2016-12-31 09:20:00", "2016-02-28 12:11:00",
                               "2016-02-28 14:55:00", "2016-02-29 12:27:00", "2016-02-29 16:32:00"],
            "idpass": ["39579449489", "39579449489", "72986744521", "72986744521", "11533148958", "72986744521",
                       "72986744521"],
            "type": ["single", "single", "pseudo", "round", "pseudo", "round", "round"]}
    df = pd.DataFrame.from_dict(data)
    print(df)
    df["HoraDTRetirada"] = pd.to_datetime(df['HoraDTRetirada'])
    df["week"] = df['HoraDTRetirada'].dt.strftime('%U')
    k = df.groupby(["idpass", "week", "type"],as_index=False).count()
    print(k)
    
    输出:

            HoraDTRetirada       idpass    type
    0  2016-02-17 15:36:00  39579449489  single
    1  2016-02-18 19:13:00  39579449489  single
    2  2016-12-31 09:20:00  72986744521  pseudo
    3  2016-02-28 12:11:00  72986744521   round
    4  2016-02-28 14:55:00  11533148958  pseudo
    5  2016-02-29 12:27:00  72986744521   round
    6  2016-02-29 16:32:00  72986744521   round
            idpass week    type  HoraDTRetirada
    0  11533148958   09  pseudo               1
    1  39579449489   07  single               2
    2  72986744521   09   round               3
    3  72986744521   52  pseudo               1
    

    这就是我得到我想要的东西的原因:

    已跳过建议答案中的步骤1,因为时间戳已经是datetime形式

    步骤2:为一年中的一周创建列:

    df['week']=df['horadretirida'].dt.strftime(“%U”)

    步骤3:按用户id、类型和周分组,并使用size()计算值


    df.groupby(['idpass','type','week']).size()

    df中的最后一个示例是2月30日。如果您使用标准库进行日期转换,这可能会给您带来错误。谢谢,我修复了它。例如,我很快修改了它,没有注意月份。所有数据点都来自同一年吗?我想按周分组,因此我认为在您的模型中,步骤3应该在步骤2之前,按周分组,而不是按日期时间分组。我尝试这样做,但我得到了以下错误:
    TypeError:仅对DatetimeIndex、TimedeltaIndex或PeriodIndex有效,但得到了“Index”的一个实例
    Updated-请告诉我现在是否可以我的原始数据集的列数比示例中列出的列数多,所以这个方法最终会打印出我不想要的所有其他列。不过,周数正是我想要的。谢谢。我只需执行以下操作即可获得所需的输出:
    All_Data.groupby(['idpass','type','week']).size()”
    ,而不是您的最后一行。