如何计算数据框中日期时间列的两个或多个类别的时间

Posted

技术标签:

【中文标题】如何计算数据框中日期时间列的两个或多个类别的时间【英文标题】:How to calculate the time for two or more category for datetime column in dataframe 【发布时间】:2020-11-30 10:22:30 【问题描述】:

我有一个由日期时间、类列组成的数据框。类列的值为“打开”、“关闭”。这是一个物联网数据。我必须计算总开放时间和总关闭时间。数据框是-

index   datetime                    class
------------------------------------------
0      2020-10-05 08:55:00.161326   open
1      2020-10-05 09:00:00.137587   close
2      2020-10-05 09:05:00.089382   close
3      2020-10-05 09:10:00.219278   close
4      2020-10-05 09:15:00.160964   close
5      2020-10-06 09:20:00.315548   close
6      2020-10-06 09:25:00.080932   open
7      2020-10-06 09:30:00.335536   open
8      2020-10-06 09:35:00.202047   close
9      2020-10-06 09:45:00.242022   open

我需要得到的响应是-

index   day_count   hour_count          class
-----------------------------------------------
0              0    0:15:00.097376      open
1              1    23:59:59.918860     close

基本上,我正在尝试使用数据捕获传感器的运行时间。如果可能的话,我也在寻找 postgresql 中的解决方案。我更喜欢 postgresql 而不是数据框。

【问题讨论】:

【参考方案1】:

Postgres 解决方案可能如下所示:

step-by-step demo:db<>fiddle

SELECT
    class,
    SUM(duration)                                                         -- 5
FROM (
    SELECT
        *,
        lead(datetime) OVER (ORDER BY datetime) - datetime as duration    -- 4
    FROM (
        SELECT
            *,
            COALESCE(                                                     -- 2
                (class != lag(class) OVER (ORDER BY datetime))::int,      -- 1
                 1
            ) as state
        FROM 
            t
    ) s
    WHERE state != 0                                                      -- 3
) s
GROUP BY class
    lag() 将当前的 class 值移动到下一行。可以比较这两个值。如果它们相等,则结果为0,否则为1 COALESCE 仅用于第一条记录,当然,它不包含以前的值 所有带有value = 0(中间步骤)的值都被删除 之后,lead() 值将下一个日期时间值复制到当前行。因此,可以计算下一个与当前datetime 值之间的差异。现在,我们知道了从一个 class 值更改到另一个的区别。 最终:按class 分组并对持续时间求和。

【讨论】:

【参考方案2】:

你可以只使用窗口函数和聚合:

select class, sum(lead_datetime - datetime) as duration
from (
    select t.*, lead(datetime) over(order by datetime) lead_datetime
    from mytable t
) t
group by class

对于每一行,这将计算直到下一行的增量持续时间,然后将其关联到当前行的class。无需跳过中间步骤,只需将持续时间相加即可。

【讨论】:

以上是关于如何计算数据框中日期时间列的两个或多个类别的时间的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Pandas 数据框中按行值对日期时间列进行排序?

在 pyspark 中,如何创建一个数组列,它是两个或多个数组列的总和?

如何绘制日期时间索引数据框中特定列的手动箱线图?

在pyspark数据框中的两个日期之间生成每月时间戳

如何根据R中另一列的日期(月/日/年)计算列的年/月平均值、最大值、最小值等

excel中如何计算出 两个日期之间相差是多少年、月、日? 日期的格式是:2011-9-7。