我希望有一个非常简单的问题。我的公司使用一种称为人性化的员工轮班管理软件,以非常难以使用的格式生成小时报告。
我需要清理它以便我可以在其余的分析中应用它但是我最好的方法是做到这一点,我无法理解它。数据开始如下:
Name | Total | Start (Sep 1, 2017) | End (Sep 1, 2017) | Hrs (Sep 1, 2017)
User 1 | 12 | 06:00 | 18:30 | 13
User 2 | 0 | | |
显然有更多的用户和更多的日期,但它会在列中重复以获取更多日期。以下是我到目前为止所做的清理工作:
data = pd.read_csv("TestReport.csv")
del data["Total"]
cols = [c for c in data.columns if c.lower()[:3] != 'hrs']
data = data[cols]
data.rename(columns=lambda x: re.sub('Start \(', '', x), inplace=True)
data.rename(columns=lambda x: re.sub('End \(', '', x), inplace=True)
data.rename(columns=lambda x: re.sub('\)', '', x), inplace=True)
data.fillna(0, inplace=True)
我最终需要为每个用户创建每天开始和结束时间的日期字段。我的数据现在将列名称作为纯月,日,年我认为最好的方法是迭代每一行并添加行值+列名,转换为日期时间,这将起作用。
然而,我不是最好的方式来做这件事,或者这甚至是最好的方式。
对我来说最重要的是每位用户都有一个合并的开始和结束日期时间,以便能够在他们换班时进一步分析他们的效率。
如果我能提供更多细节,请告诉我,
谢谢!
安迪麦克马斯特 *******************编辑显示示例*********************理想情况下,最终目标是为每个用户创建一系列日期范围。我需要能够将这些系列与我的数据框进行比较,该数据框保存所有员工的工作记录,然后将每条记录分配给管理该记录的用户(团队负责人)。
理想情况下,结束
Name | Total | Start (Sep 1, 2017) | End (Sep 1, 2017) | Hrs (Sep 1, 2017)
User 1 | 12 | 06:00 Sep 1, 2017 | 18:30 Sep 1, 2017 | 13
User 2 | 0 | | |
答案 0 :(得分:0)
全部 - 至少在我看来,我发现了解决这个问题的最佳方法。我坚持使用相同的数据清理,但最终得到一个像这样的小块来创建一个可行的列表来一起添加小时和日期。
month_list = data.columns.tolist()
month_list.remove('Name')
new_list = []
for i in month_list:
if i not in new_list:
new_list.append(i)
for i in new_list:
data[i] = i + " " + data[i].astype(str)
这会生成如下所示的数据:
Name Sep 1, 2017 Sep 1, 2017 Sep 2, 2017 \
0 User 1 Sep 1, 2017 6:00 Sep 1, 2017 18:30 Sep 2, 2017 6:00
1 User 2 Sep 1, 2017 0 Sep 1, 2017 0 Sep 2, 2017 0
2 User 3 Sep 1, 2017 0 Sep 1, 2017 0 Sep 2, 2017 0
3 User 4 Sep 1, 2017 0 Sep 1, 2017 0 Sep 2, 2017 0
4 User 5 Sep 1, 2017 6:00 Sep 1, 2017 12:00 Sep 2, 2017 6:00
接下来的步骤将涉及重新设计我的代码以删除所有零次或在路上创建过滤器,以便我浏览每个用户,我只使用他们工作的可用时间。
希望如果他们有一个设计糟糕的时间表需要合作,这将有助于他人。