【问题标题】:Pandas group by time interval (5min, 10min, 1day, 1year) and count amount of entriesPandas 按时间间隔(5 分钟、10 分钟、1 天、1 年)和条目数量进行分组
【发布时间】:2020-07-15 13:27:04
【问题描述】:

我有一个简单的 pandas 数据框,每天大约有 10000 到 20000 个条目。此数据框包含一个点和一个日期时间 (datetime64)。例如,它看起来像这样:

        point   timestamp_local
0       A       2018-09-29 00:00:20
1       A       2018-09-29 00:04:34
2       A       2018-09-29 00:06:59
3       B       2018-09-29 00:11:09
4       B       2018-09-29 01:19:28
...     ...     ...
24282   B       2018-09-29 21:40:26
24283   C       2018-09-29 21:40:31
24284   C       2018-09-29 21:45:17
24285   A       2018-09-29 22:20:29
24286   B       2018-09-29 22:28:08

我现在得到的是一个数据帧,它按点和我要指定的间隔对上面的数据帧进行分组,并且还计算间隔每个点的条目数量。此外,间隔应该是例如 5 分钟。间隔,10分钟。间隔或每天、每月或每年的 1 个间隔。

这是我到目前为止分割区间的内容:

df['10min_period'] = df.apply(lambda x: "period_%d"%(int(x[1].minute/10) + 1), axis=1)

这会返回:

    point   timestamp_local         10min_period
0   A       2018-09-29 00:00:20     period_1
1   B       2018-09-29 00:04:34     period_1
2   B       2018-09-29 00:06:59     period_1
3   C       2018-09-29 00:11:09     period_2
4   C       2018-09-29 01:19:28     period_2

这会计算句点:

df = df.groupby([df['point'], df['10min_period']]).agg(['count'])

这将返回以下数据框:

                           timestamp_local
point   10min_period       count
A       period_1           2092
        period_2           2437
        period_3           2181
        period_4           2525
        period_5           2325
        period_6           2317
B       period_1           1814
        period_2           1719
        period_3           1732
        period_4           1575
        period_5           1789
        period_6           1781
...     ...                ...

但这并不是我想要的。其原因是期间行条目错误。我的代码已将年、月、日和小时以 10 分钟的间隔独立分段。 这正是我不想要的!

我想要一个按我指定的间隔分段的日期帧,例如5分钟。 , 10 min., 1 day, 1 year 等等但考虑年、月、日、小时和分钟! (看看句号是如何命名的!)

I give you an example of what I want:
        point   timestamp_local         10min_period
    0   A       2018-09-29 00:00:20     period_2018-09-29_00:00:00
    1   B       2018-09-29 00:04:34     period_2018-09-29_00:00:00
    2   B       2018-09-29 00:06:59     period_2018-09-29_00:00:00
    3   C       2018-09-29 00:11:09     period_2018-09-29_00:10:00
    4   C       2018-09-29 00:19:28     period_2018-09-29_00:10:00
    5   A       2018-09-29 00:00:20     period_2018-09-29_00:00:00
    6   B       2018-09-30 01:04:34     period_2018-09-30_01:00:00
    7   B       2018-09-30 00:06:59     period_2018-09-30_00:00:00
    8   C       2018-10-29 02:15:09     period_2018-10-29_02:15:00
    9   C       2019-09-29 01:19:28     period_2019-09-29_01:10:00

以这种方式命名期间非常重要,因此我知道该条目包含的日期和时间间隔。我怎样才能做到这一点?例如,如果间隔为 5 分钟,则该时间段应命名为 period_2018-09-29_00:00:00period_2018-09-29_00:05:00period_2018-09-29_00:25:00 等等。

非常感谢!

【问题讨论】:

    标签: python pandas dataframe pandas-groupby


    【解决方案1】:

    您是否正在寻找这样的东西,每隔几分钟:

    df.groupby(['point',df.timestamp_local.dt.floor('5Min')]).size()
    

    这个,月/年

    df.groupby(['point', df.timestamp_local.dt.to_period('M')]).size()
    

    【讨论】:

    • 是的,完美!这就是我在寻找的地方。只有一个问题:如何用计数命名行,我可以将它重命名为类似计数的名称吗? Pandas 只显示 0 作为行名。
    • 另外,如何将其绘制为按点分组的折线图? (所以每个点一行)
    • 因为现在是MultiIndex 我无法再通过df[df[point == 'a']] 访问这些点...我如何才能再次将其“转换”为普通的DataFrame?
    • 这是很多额外的问题,没有太多关于您期望的细节。我认为我无法在 cmets 中解决它们 :-)。
    猜你喜欢
    • 2019-04-10
    • 2020-07-30
    • 2021-01-05
    • 2013-06-28
    • 2022-01-25
    • 1970-01-01
    • 2016-04-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多