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