首页 > 解决方案 > Pandas Python - 比较不同的日期范围并检查它们是否在同一时间段内

问题描述

我目前正在解决一个问题,建议使用“Pandas”,因为它适合我的解决方案,所以我很抱歉,因为我对“Pandas”包有点陌生。

我要解决的问题是读取包含如下数据的文本文件:

EmpID,ProjectID,DateFrom,DateTo
1,100,2014-11-01,2015-05-01
2,101,2013-12-06,2014-10-06
3,102,2015-06-04,2017-09-04
5,103,2014-10-01,2015-12-01
2,100,2013-03-07,2015-11-07
2,103,2015-07-09,2019-01-19
4,102,2013-11-13,2014-03-13
4,103,2016-02-14,2017-03-15
5,104,2014-03-15,2015-11-09

现在我的任务是说明哪些员工在一个共同的项目上一起工作的时间最长。

这是我到目前为止的进展:

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

date_parser = lambda c: pd.to_datetime(c, format='%Y/%m/%d', errors='coerce')
df = pd.read_csv('data.csv', delimiter = ',', parse_dates=[2,3], date_parser=date_parser)
#df.set_index("EmpID", inplace = True)
df.sort_values(['ProjectID'], inplace=True)
df['Days Worked'] = (df['DateTo'] - df['DateFrom']).dt.days
cutdown_projecs = df.groupby('ProjectID').filter(lambda x: len(x) >= 2)

print(cutdown_projecs)

我所做的是订购表格,将日期值设置为正确的格式,按 ProjectID 排序,然后缩减为重复两次或更多次的项目(因为这意味着员工一起工作)。我还添加了一个新列,其中添加了“工作天数”。这导致我得到以下结果:

     EmpID  ProjectID   DateFrom     DateTo      Days Worked
0      1        100    2014-11-01 2015-05-01          181
4      2        100    2013-03-07 2015-11-07          975
2      3        102    2015-06-04 2017-09-04          823
6      4        102    2013-11-13 2014-03-13          120
3      5        103    2014-10-01 2015-12-01          426
5      2        103    2015-07-09 2019-01-19         1290
7      4        103    2016-02-14 2017-03-15          395

现在,我需要关于如何正确解决问题的建议。我不知何故需要检查哪些数据范围在同一个项目上“冲突”,然后一起计算员工的工作日。如果您能给我小费,我将不胜感激。谢谢你。

编辑:固定表。

标签: pythonpandascsvdatatable

解决方案


我拼凑了一个解决方案,但不知道它是否满足您的需求。它是 2 名员工一起工作的最长时间。

from collections import defaultdict
from itertools import combinations
from datetime import datetime

data ='''\
1,100,2014-11-01,2015-05-01
2,101,2013-12-06,2014-10-06
3,102,2015-06-04,2017-09-04
5,103,2014-10-01,2015-12-01
2,100,2013-03-07,2015-11-07
2,103,2015-07-09,2019-01-19
4,102,2013-11-13,2014-03-13
4,103,2016-02-14,2017-03-15
5,104,2014-03-15,2015-11-09'''.splitlines()

d = defaultdict(list)
for line in data:
    empID, job, start, finish = line.split(',')
    d[job].append([empID,start,finish])

for job, aref in d.items():
    if len(aref) >= 2:
        for ref in combinations(aref, 2):
            begin = max(map(lambda x: x[1], ref))
            end = min(map(lambda x: x[2], ref))
            delta = datetime.strptime(end, '%Y-%m-%d') \
                    - datetime.strptime(begin, '%Y-%m-%d')
            dd = delta.days
            if dd > 0:
                print('employees', ref[0][0], 'and', ref[1][0],
                      'worked together', dd, 'days on job', job)

输出是:

employees 1 and 2 worked together 181 days on job 100
employees 5 and 2 worked together 145 days on job 103
employees 2 and 4 worked together 395 days on job 103
>>> 

推荐阅读