python - 计算数据帧中属于给定日期时间间隔的唯一值

标签 python python-3.x pandas dataframe datetime

我有一个数据框:

ID           time_begin               time_end
A1      2019-04-04 08:04:56      2019-04-04 08:15:26
A11     2019-04-04 08:14:22      2019-04-04 08:42:04
BB      2019-04-04 08:44:53      2019-04-04 09:02:11
C5      2019-04-04 09:01:12      2019-04-04 09:22:07
C1      2019-04-04 09:03:51      2019-04-04 09:34:20
DD      2019-04-04 09:22:42      2019-04-04 09:42:42
DD1     2019-04-04 09:25:42      2019-04-04 09:47:55
因此,我想在 20 分钟的“时间”样本中获得跨越时间戳半小时值的最大 ID 数。
  • 所以对于 时间戳从 8:00 到 8:20 我们得到 2 个唯一 ID(2019-04-04 08:04:56 和 2019-04-04 08:14:22)。但是只有ID A11跨过8:20(因为它的持续时间是2019-04-04 08:14:22到2019-04-04 08:42:04),所以我们只计算它。
  • 对于 时间戳从 8:20 到 8:40 我们得到 0 个唯一 ID。
  • 对于从 8:40 到 9:00 的 时间戳,我们得到 1 个唯一 ID BB。它跨越了 9:00 的值,所以我们计算它。
  • 对于从 9:00 到 9:20 时间戳,我们得到 2 个 ID C5 和 C1。
  • 对于 时间戳从 9:20 到 9:40 我们得到 2 个 ID DD 和 DD1,因为它们都跨越了 9:40。期望的结果是将其作为数据帧:
  • time                    ID_num
    2019-04-04 08:00:00        1
    2019-04-04 08:20:00        0
    2019-04-04 08:40:00        1
    2019-04-04 09:00:00        2
    2019-04-04 09:20:00        2
    
    我怎么能那样做?我棘手的部分是,仅当 ID 跨越值 8:00、8:20、8:40 时才计算 ID,......

    最佳答案

    这看起来可以通过交叉合并和查询来完成:

    # set up the time intervals
    intervals = pd.date_range(df.time_begin.min().floor('20min'), 
                              df.time_end.max().ceil('20min'), freq='20min')
    
    ref = pd.DataFrame({'dummy':1,'start':intervals[:-1], 'end':intervals[1:]})
    
    (df.assign(dummy=1)
       .merge(ref, on='dummy')
       .query('start < time_begin < end <= time_end')    # your logic is here
       .groupby('start')
       .size()
       .reindex(intervals[:-1], fill_value=0)
    )
    
    输出:
    2019-04-04 08:00:00    1
    2019-04-04 08:20:00    0
    2019-04-04 08:40:00    1
    2019-04-04 09:00:00    2
    2019-04-04 09:20:00    2
    2019-04-04 09:40:00    0
    Freq: 20T, dtype: int64
    

    关于python - 计算数据帧中属于给定日期时间间隔的唯一值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64227062/

    相关文章:

    python - Pandas 数据透视表上的行总和

    python - 如何仅聚合混合 dtypes 数据框中的数字列

    python - 在 Python 中从 URL 下载视频

    python - 在Python中大规模连接字符串

    python - 如何在 Python 中获取处理器名称?

    Python排序列表设置

    python - 为什么从生成器内调用模拟对象无法正确测试?

    python - 如何在函数返回后打印语句?

    python - pyinstaller kivy错误无法获取任何图像提供程序,中止

    python - 具有预定义箱和闭/开区间的箱变量