熊猫 - 行中X分钟内的日期时间

时间:2017-09-13 18:40:55

标签: python pandas

我不是完全肯定的最好的方式来询问或说出这个问题所以我会突出我的问题,数据集,我对方法和最终目标的想法,并希望最终会清楚。

我的问题:

我的公司派遣工人,即使他们当前正在派遣,他们也会向一名员工发送报告。这是由于我们使用的软件的限制。如果员工在30分钟内收到两份报告,我们称之为双重派遣。

我们正在分析我们的调度效率,而且我遇到了一些令人头疼的问题。我需要运行我们的100k行数据库并添加一个额外的列,该列将作为正常的双0读取为虚拟变量1。但是因为我们有多个人发送,而我们的记录没有通过发送开始排序,我需要确定在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以获取我的报告,以便我可以对其进行过滤和计算。

感谢您的时间和帮助,如果有必要,请告诉我。

谢谢!

------------------ EDIT ------------- 添加了一个编辑,使问题清晰,因为我之前没有这么做。

问题:Pandas是用于迭代我的数据帧以查看每个日期时间调度的最佳工具,是否有与Tech的名称相匹配的记录,距离此记录不到30分钟。

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

Desired Output - 一个附加列,用于记录在30分钟窗口内发生的调度是否为真0的虚拟变量1为False。我需要查看何时发生双重调度以及有多少记录是真正的双重调度,而不仅仅是说有100个双重调度实例,但涉及200多条记录。我需要能够对每条记录进行排序和查看。

1 个答案:

答案 0 :(得分:1)

您好我认为我找到了解决方案。它很慢,只比较一个指数之前或之后,但就三十分钟内有三次发送的情况而言,这对我们来说不到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()