考虑以下迷你版本的问题:

from io import StringIO

from pandas import read_csv, to_datetime

# how close do sessions have to be to be considered equal? (in minutes)

threshold = 5

# datetime column (combination of date + start_time)

dtc = [['date', 'start_time']]

# index column (above combination)

ixc = 'date_start_time'

df1 = read_csv(StringIO(u'''

date,start_time,employee_id,session_id

01/01/2016,02:03:00,7261824,871631182

01/01/2016,06:03:00,7261824,871631183

01/01/2016,11:01:00,7261824,871631184

01/01/2016,14:01:00,7261824,871631185

'''), parse_dates=dtc)

df2 = read_csv(StringIO(u'''

date,start_time,employee_id,session_id

01/01/2016,02:03:00,7261824,871631182

01/01/2016,06:05:00,7261824,871631183

01/01/2016,11:04:00,7261824,871631184

01/01/2016,14:10:00,7261824,871631185

'''), parse_dates=dtc)

这使

>>> df1

date_start_time employee_id session_id

0 2016-01-01 02:03:00 7261824 871631182

1 2016-01-01 06:03:00 7261824 871631183

2 2016-01-01 11:01:00 7261824 871631184

3 2016-01-01 14:01:00 7261824 871631185

>>> df2

date_start_time employee_id session_id

0 2016-01-01 02:03:00 7261824 871631182

1 2016-01-01 06:05:00 7261824 871631183

2 2016-01-01 11:04:00 7261824 871631184

3 2016-01-01 14:10:00 7261824 871631185

您希望在合并时将 df2[0:3] 视为 df1[0:3] 的重复项(因为它们分别相隔不到5分钟),但将 df1[3] 和 df2[3] 视为单独的会话 .

解决方案1:间隔匹配

这基本上就是您在编辑中建议的内容 . 您希望将两个表中的时间戳映射到以时间戳为中心的10分钟间隔,四舍五入到最接近的5分钟 .

每个间隔可以通过其中点唯一地表示,因此您可以将时间戳上的数据帧合并到最接近的5分钟 . 例如:

import numpy as np

# half-threshold in nanoseconds

threshold_ns = threshold * 60 * 1e9

# compute "interval" to which each session belongs

df1['interval'] = to_datetime(np.round(df1.date_start_time.astype(np.int64) / threshold_ns) * threshold_ns)

df2['interval'] = to_datetime(np.round(df2.date_start_time.astype(np.int64) / threshold_ns) * threshold_ns)

# join

cols = ['interval', 'employee_id', 'session_id']

print df1.merge(df2, on=cols, how='outer')[cols]

打印

interval employee_id session_id

0 2016-01-01 02:05:00 7261824 871631182

1 2016-01-01 06:05:00 7261824 871631183

2 2016-01-01 11:00:00 7261824 871631184

3 2016-01-01 14:00:00 7261824 871631185

4 2016-01-01 11:05:00 7261824 871631184

5 2016-01-01 14:10:00 7261824 871631185

请注意,这不完全正确 . 会话 df1[2] 和 df2[2] 不会被视为重复,尽管它们相距仅3分钟 . 这是因为它们位于区间边界的不同侧 .

解决方案2:一对一匹配

这是另一种方法,它取决于 df1 中的会话在 df2 中具有零或一个重复的条件 .

我们将 df1 中的时间戳替换为 df2 中与 employee_id 匹配的最接近的时间戳,并且 session_id and 距离不到5分钟 .

from datetime import timedelta

# get closest match from "df2" to row from "df1" (as long as it's below the threshold)

def closest(row):

matches = df2.loc[(df2.employee_id == row.employee_id) &

(df2.session_id == row.session_id)]

deltas = matches.date_start_time - row.date_start_time

deltas = deltas.loc[deltas <= timedelta(minutes=threshold)]

try:

return matches.loc[deltas.idxmin()]

except ValueError: # no items

return row

# replace timestamps in "df1" with closest timestamps in "df2"

df1 = df1.apply(closest, axis=1)

# join

cols = ['date_start_time', 'employee_id', 'session_id']

print df1.merge(df2, on=cols, how='outer')[cols]

打印

date_start_time employee_id session_id

0 2016-01-01 02:03:00 7261824 871631182

1 2016-01-01 06:05:00 7261824 871631183

2 2016-01-01 11:04:00 7261824 871631184

3 2016-01-01 14:01:00 7261824 871631185

4 2016-01-01 14:10:00 7261824 871631185

这种方法要慢得多,因为你必须为 df1 中的每一行搜索整个 df2 . 我写的内容可能会进一步优化,但这仍需要很长时间才能完成大型数据集 .

java合并不连续的时间段_基于时间戳不完全匹配的pandas合并相关推荐

  1. java象棋游戏用户特点_基于Java Swing的《中国象棋》游戏的设计与实现

    60 开发经验 3基金项目: 江西省自然科学基金资助项目(编号: 0411046); 江西省高性能计算技术重点实验室资助基金项目(No. JXHC20052003) ). 基于 Java Swing ...

  2. 多个字符合并成一个数组_一个excel多个sheet,需要合并为一个sheet

    一个excel文件中,有多个sheet,现在需要合并成一个文件. 需要按列合并成. 由于每个sheet中的列名称一样,合并后,需要重新命名. 每个sheet中的id是有一样的,读入文件的时候,就需要指 ...

  3. 浙江农林大学python期末考试_基于Python的地图匹配最短路径法实现

    117 科学论坛 在智能交通领域,众所周知,智能 交通系统在当今世界道路交通网络的管 理中发挥着重要的作用,而车辆导航系 统又是智能交通系统的重要组成部分. 在车辆导航系统中,定位的精确性和实 时性是 ...

  4. java怎么写桌面日历_基于java的桌面日历系统的设计与实现毕业设计论文最终版.doc...

    基于java的桌面日历系统的设计与实现毕业设计论文最终版 分类号_______________ 密级________________ UDC _______________ 学号_ ___ 毕业设计( ...

  5. java美容美发项目下载_基于jsp的美容美发管理-JavaEE实现美容美发管理 - java项目源码...

    基于jsp+servlet+pojo+mysql实现一个javaee/javaweb的美容美发管理, 该项目可用各类java课程设计大作业中, 美容美发管理的系统架构分为前后台两部分, 最终实现在线上 ...

  6. java门户网站项目代码_基于jsp的企业门户网站-JavaEE实现企业门户网站 - java项目源码...

    基于jsp+servlet+pojo+mysql实现一个javaee/javaweb的企业门户网站, 该项目可用各类java课程设计大作业中, 企业门户网站的系统架构分为前后台两部分, 最终实现在线上 ...

  7. java创建医生的对象_基于安卓Android的作物医生App设计开发(MySQL)(含录像)

    基于安卓Android的作物医生App设计开发(MySQL)(含录像)(毕业论文14000字,PHP程序代码,MySQL数据库) 本系统使用软件工程方法进行一系列的分析.设计.实现与测试.使用面向对象 ...

  8. java教务系统类设计_基于Java EE体系的高校教务管理系统的设计开发

    <基于Java EE体系的高校教务管理系统的设计开发>由会员分享,可在线阅读,更多相关<基于Java EE体系的高校教务管理系统的设计开发(3页珍藏版)>请在人人文库网上搜索. ...

  9. java ee会员功能项目_基于jsp的会员系统-JavaEE实现会员系统 - java项目源码

    基于jsp+servlet+pojo+mysql实现一个javaee/javaweb的会员系统, 该项目可用各类java课程设计大作业中, 会员系统的系统架构分为前后台两部分, 最终实现在线上进行会员 ...

最新文章

  1. 面向对象编程02—装饰器、类方法、静态方、访问控制
  2. 文件手动删除后 同步到git
  3. java访问rabbitMQ 一
  4. linux命令详解——sar
  5. linux sh 按键精灵,按键精灵脚本代码教程
  6. Tcl 语言——流程控制篇
  7. 2020,ToB 生态全景解读
  8. 企业微信网页应用开发 - 开发环境搭建
  9. 线性方程组(四)- 矩阵方程
  10. 计算机注销和重新启动的区别,注销和重启的区别(转载)
  11. 计算机中存储单位的换算
  12. Bugku:杂项 一枝独秀
  13. excel shared formula处理
  14. 论文:Object-centric Auto-encoders and Dummy Anomalies for Abnormal Event Detection in Video阅读遇到的问题及解答
  15. Botnet趋势漏洞利用状况分析
  16. arw是什么格式?arw格式用什么软件打开?arw格式怎么转换成jpg
  17. 最简单的数据备份的方法
  18. 淮南师范学院计算机组成原理试卷,淮南师范学院物化试卷J
  19. 获取application.yml文件中配置参数的两个方法
  20. 魔兽插件是用php吗,【图片】手把手教你制作自己的界面【魔兽插件吧】_百度贴吧...

热门文章

  1. ubuntu linux 下 adb 连接andoid 设备
  2. 一起来用Websocket(二):Websocket协议详细分析
  3. android消息提示方法自定义,Android自定义消息提示容器
  4. php删除excel文件,PHPExcel:HTML到Excel,写入删除excel文件中的CSS
  5. 【连载】如何掌握openGauss数据库核心技术?秘诀三:拿捏存储技术(4)
  6. 操作系统宕机,MySQL数据找回记录
  7. 20万DBA最关注的11个问题
  8. VEGA:诺亚AutoML高性能开源算法集简介
  9. 云小课 | 华为云KYON之L2CG
  10. 【IoT平台技术对接分享】如何上传正确的消息推送证书