Python Pandas-从第行开始的X分钟内的日期时间

Python Pandas-从第行开始的X分钟内的日期时间,python,pandas,Python,Pandas,我不完全肯定问这个问题或表达这个问题的最佳方式,因此我将强调我的问题、数据集、我对方法和最终目标的想法,希望在最后它会变得清晰 我的问题是: 我的公司派遣员工,并将向单个员工加载派遣,即使他们是当前派遣的员工。这是由于我们使用的软件的限制。如果一名员工在30分钟内收到两份派遣,我们称之为双重派遣 我们正在分析我们的调度效率,我有点头疼。我需要运行我们的100k行数据库,并添加一个额外的列,该列将作为虚拟变量1读取,用于正常情况下的双0。但由于我们有多人被分派,而且我们的记录不是按分派开始排序的,

我不完全肯定问这个问题或表达这个问题的最佳方式,因此我将强调我的问题、数据集、我对方法和最终目标的想法,希望在最后它会变得清晰

我的问题是:

我的公司派遣员工,并将向单个员工加载派遣,即使他们是当前派遣的员工。这是由于我们使用的软件的限制。如果一名员工在30分钟内收到两份派遣,我们称之为双重派遣

我们正在分析我们的调度效率,我有点头疼。我需要运行我们的100k行数据库,并添加一个额外的列,该列将作为虚拟变量1读取,用于正常情况下的双0。但由于我们有多人被分派,而且我们的记录不是按分派开始排序的,因此我需要确定在30分钟内同一个人被分派的频率

数据集:

由于我们的数据仓库组织不善,数据集非常庞大,但就我需要的项目而言,这些是我计算所需的列

Tech Name         |  Dispatch Time (PST)   
John Smith        |  1/1/2017 12:34
Jane Smith        |  1/1/2017 12:46
John Smith        |  1/1/2017 18:32
John Smith        |  1/1/2017 18:50
我的想法: 我会怎么做是笨重的,它可以单向工作,但不能向后。我或多或少会将我的代码编写为:

import pandas as pd

df = pd.read_excel('data.xlsx')
df.sort('Dispatch Time (PST)', inplace = True)

tech_name = None
dispatch_time = pd.to_datetime('1/1/1900 00:00:00')

for index, row in df.iterrows():
    if tech_name is None:
        tech_name = row['Tech Name']
    else:
        if dispatch_time.pd.time_delta('0 Days 00:30:00') > row['Tech Dispatch Time (PST)'] AND row['Tech Name'] = tech_name:
            row['Double Dispatch'] = 1
            dispatch_time = row['Tech Dispatch Time (PST)']
        else:
            dispatch_time = row['Tech Dispatch Time (PST)']
            tech_name = row['Tech Name']
这有很多问题,因为速度慢,只跟踪向后的日期,而不跟踪向前的日期,所以我将错过许多调度

最终目标:

我的目标是创建一个数据集,然后通过添加一列作为伪变量,将其插入到报表的Tableau中,这样我就可以对其进行过滤和计算

我感谢你的时间和帮助,如果需要更多的细节,请告诉我

谢谢大家!

------------------编辑------------- 添加了一个编辑,以澄清问题,因为我之前没有这样做

问:Pandas是迭代我的数据帧以查看每个datetime调度的最佳工具吗?是否有一条与技术人员姓名匹配且距离此记录不到30分钟的记录

如果是这样,我如何改进我的算法或理论,如果不是,最好的工具是什么


期望输出-一个附加列,记录在30分钟窗口内是否发生调度,作为伪变量1表示真0表示假。我需要知道什么时候发生了双重分派,有多少记录是真正的双重分派,不仅仅是一个计数说有100次双重分派,而是涉及200多条记录。我需要能够对每条记录进行排序和查看。

您好,我想我找到了一个解决方案。它的速度很慢,只比较了前后的一个指数,但就30分钟内有3次调度的情况而言,这对我们来说不到0.5%

import pandas as pd
import numpy as np
import datetime as dt

dispatch = 'Tech Dispatched Date-Time (PST)'
tech = 'CombinedTech'
df = pd.read_excel('combined_data.xlsx')
df.sort_values(dispatch, inplace=True)
df.reset_index(inplace = True)
df['Double Dispatch'] = np.NaN

writer = pd.ExcelWriter('final_output.xlsx', engine='xlsxwriter')

dispatch_count = 0
time = dt.timedelta(minutes = 30)

for index, row in df.iterrows():
    try:
        tech_one = df[tech].loc[(index - 1)]
        dispatch_one = df[dispatch].loc[(index - 1)]
    except KeyError:
        tech_one = None
        dispatch_one = pd.to_datetime('1/1/1990 00:00:00')
    try:
        tech_two = df[tech].loc[(index + 1)]
        dispatch_two = df[dispatch].loc[(index + 1)]
    except KeyError:
        tech_two = None
        dispatch_two = pd.to_datetime('1/1/2020 00:00:00')
    first_time = dispatch_one + time
    second_time = pd.to_datetime(row[dispatch]) + time 
    dispatch_pd = pd.to_datetime(row[dispatch])
    if tech_one == row[tech] or tech_two == row[tech]:
        if first_time > row[dispatch] or second_time > dispatch_two:
            df.set_value(index, 'Double Dispatch', 1)
            dispatch_count += 1
        else:
            df.set_value(index, 'Double Dispatch', 0)
            dispatch_count += 1
    print(dispatch_count) # This was to monitor total # of records being pushed through

df.to_excel(writer,sheet_name='Sheet1')
writer.save()
writer.close()

没问题。你在找算法方面的帮助吗?还是一个特定的编码问题?您是否尝试实施“日期向前”解决方案?它必须是熊猫解决方案吗?请解释您希望给定样本输入的输出是什么。比如说,如果你给同一个人发了100封邮件,每封相隔一分钟,你想把它们都归为第一封邮件的“双份”吗?因为每封邮件都与另一封邮件相隔不到30分钟,即使最后一封邮件与第一封邮件相隔超过30分钟?二战一号添加了一个编辑,回答了这两个问题。非常感谢。