- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试获取员工考勤卡数据,每行都有打洞开始时间和结束时间,其间的时间可以在 0 分钟到 9 小时之间的任何范围内。我想了解每一行员工每小时工作了多少时间。我可以通过以下方式做到这一点:
import pandas as pd
import numpy as np
pd.options.display.max_columns = 100
store_id = np.repeat(1,10)
employee = [1,2,3,1,2,3,1,2,3,4]
start_time = pd.date_range('2015-07-03', periods=10, freq='25T')
end_time = pd.date_range('2015-07-03', periods = 10,freq = '40T')
df = pd.DataFrame({'store_id':store_id,'employee':employee,'start_time':start_time,'end_time':end_time})
df.head()
employee end_time start_time store_id
0 1 2015-07-03 00:00:00 2015-07-03 00:00:00 1
1 2 2015-07-03 00:40:00 2015-07-03 00:25:00 1
2 3 2015-07-03 01:20:00 2015-07-03 00:50:00 1
3 1 2015-07-03 02:00:00 2015-07-03 01:15:00 1
4 2 2015-07-03 02:40:00 2015-07-03 01:40:00 1
df['date']=df['start_time'].dt.date
def shift_time_in_hr(row):
#hrs- Dictionary assigning each hour as a key to the time worked in that particular hour
hrs = dict(zip(np.arange(0,25),[pd.Timedelta(0)]*24))
#Case 1: if the start time and end time in the same hour then assign minutes to the start hour
if row['start_time'].hour == row['end_time'].hour:
hrs[row['start_time'].hour]= row['end_time']-row['start_time']
return row.append(pd.Series(list(hrs.values()),index = ['{}_hr'.format(i) for i in list(hrs.keys())]))
else:
hrs_worked = np.arange(row['start_time'].hour,row['end_time'].hour+1)
#Case 2: If the start_time and end_time are in different Hours and if there are more hours in between assign them with 60 minutes
if len(hrs_worked)>2:
for i in range(hrs_worked[0]+1,hrs_worked[-1]):
hrs[i] = pd.Timedelta('1 Hour')
#Assign start_time and end_time minutes to respective hours
hrs[hrs_worked[0]] = pd.Timedelta('{} Minutes'.format(60-row['start_time'].minute))
#hrs[hrs_worked[0]] = 60-row['start_time'].minute
hrs[hrs_worked[-1]]= pd.Timedelta('{} Minutes'.format(row['end_time'].minute))
return row.append(pd.Series(list(hrs.values()),index = ['{}_hr'.format(i) for i in list(hrs.keys())]))
df=df.apply(shift_time_in_hr,axis = 1)
df.head()
employee end_time start_time store_id date 0_hr 1_hr 2_hr 3_hr 4_hr 5_hr 6_hr 7_hr 8_hr 9_hr 10_hr 11_hr 12_hr 13_hr 14_hr 15_hr 16_hr 17_hr 18_hr 19_hr 20_hr 21_hr 22_hr 23_hr
0 1 2015-07-03 00:00:00 2015-07-03 00:00:00 1 2015-07-03 00:00:00 00:00:00 00:00:00 0 days 0 days 0 days 0 days 0 days 0 days 0 days 0 days 0 days 0 days 0 days 0 days 0 days 0 days 0 days 0 days 0 days 0 days 0 days 0 days 0 days
1 2 2015-07-03 00:40:00 2015-07-03 00:25:00 1 2015-07-03 00:15:00 00:00:00 00:00:00 0 days 0 days 0 days 0 days 0 days 0 days 0 days 0 days 0 days 0 days 0 days 0 days 0 days 0 days 0 days 0 days 0 days 0 days 0 days 0 days 0 days
2 3 2015-07-03 01:20:00 2015-07-03 00:50:00 1 2015-07-03 00:10:00 00:20:00 00:00:00 0 days 0 days 0 days 0 days 0 days 0 days 0 days 0 days 0 days 0 days 0 days 0 days 0 days 0 days 0 days 0 days 0 days 0 days 0 days 0 days 0 days
3 1 2015-07-03 02:00:00 2015-07-03 01:15:00 1 2015-07-03 00:00:00 00:45:00 00:00:00 0 days 0 days 0 days 0 days 0 days 0 days 0 days 0 days 0 days 0 days 0 days 0 days 0 days 0 days 0 days 0 days 0 days 0 days 0 days 0 days 0 days
4 2 2015-07-03 02:40:00 2015-07-03 01:40:00 1 2015-07-03 00:00:00 00:20:00 00:40:00 0 days 0 days 0 days 0 days 0 days 0 days 0 days 0 days 0 days 0 days 0 days 0 days 0 days 0 days 0 days 0 days 0 days 0 days 0 days 0 days 0 days
dict_agg= dict(zip(df.columns[5:],[np.sum]*24))
df.groupby(['store_id','employee','date']).agg(dict_agg)
预期输出:一天中员工每小时工作的分钟数。
0_hr 1_hr 2_hr 3_hr 4_hr 5_hr 6_hr 7_hr 8_hr 9_hr 10_hr 11_hr 12_hr 13_hr 14_hr 15_hr 16_hr 17_hr 18_hr 19_hr 20_hr 21_hr 22_hr 23_hr
store_id employee date
1 1 2015-07-03 00:00:00 00:45:00 00:30:00 01:00:00 00:00:00 00:00:00 0 days 0 days 0 days 0 days 0 days 0 days 0 days 0 days 0 days 0 days 0 days 0 days 0 days 0 days 0 days 0 days 0 days 0 days
2 2015-07-03 00:15:00 00:20:00 00:45:00 01:00:00 00:40:00 00:00:00 0 days 0 days 0 days 0 days 0 days 0 days 0 days 0 days 0 days 0 days 0 days 0 days 0 days 0 days 0 days 0 days 0 days 0 days
3 2015-07-03 00:10:00 00:20:00 00:55:00 01:00:00 01:00:00 00:20:00 0 days 0 days 0 days 0 days 0 days 0 days 0 days 0 days 0 days 0 days 0 days 0 days 0 days 0 days 0 days 0 days 0 days 0 days
4 2015-07-03 00:00:00 00:00:00 00:00:00 00:15:00 01:00:00 01:00:00 0 days 0 days 0 days 0 days 0 days 0 days 0 days 0 days 0 days 0 days 0 days 0 days 0 days 0 days 0 days 0 days 0 days 0 days
有没有更好的方法来做到这一点,或者更多的Pythonic或Pandas方式来实现我能够以简单的方式做到的事情!
最佳答案
这不是完整的答案,而是您可以使用的构建 block 。
让我们计算给定开始和结束时间戳的工作分钟数,希望以一种对 pandas 更友好的方式:
import pandas as pd
def diff(ts):
ts[ts < pd.Timedelta(0)] = pd.Timedelta(0)
return (ts - ts.shift(1)).fillna(0)
def calculate_time_worked(start, end):
_range = pd.date_range(start=start.date(),
end=end.date()+pd.Timedelta('1D'),
freq='H')
base = pd.Series(_range)
time_worked = diff(base-start) - diff(base-end)
time_worked = time_worked.apply(lambda x: x.total_seconds() / 60)
time_worked.index = base
return time_worked[time_worked > 0]
start = pd.Timestamp('2017-06-13 20:11')
end = pd.Timestamp('2017-06-13 22:35')
time_worked = calculate_time_worked(start, end)
assert time_worked.to_dict() == {
pd.Timestamp('2017-06-13 21:00'): 49.0,
pd.Timestamp('2017-06-13 22:00'): 60.0,
pd.Timestamp('2017-06-13 23:00'): 35.0}
您可以通过多种方式使用该函数 - 例如,生成 (timestamp, time_worked, id, store) 的元组或字典并构建工作时间段的平面数据帧,然后在连接中将其 reshape 为所需的格式手术。请随意构建此代码并希望它有用。
关于python - Pandas 优化 - 如何处理两列中的 Pandas 时间序列数据并获取列之间的每小时数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50863229/
我需要修复 getLineNumberFor 方法,以便如果 lastName 的第一个字符位于 A 和 M 之间,则返回 1;如果它位于 N 和 Z 之间,则返回 2。 在我看来听起来很简单,但我不
您好,感谢您的帮助!我有这个: 0 我必须在每次点击后增加“pinli
Javascript 中是否有一种方法可以在不使用 if 语句的情况下通过 switch case 结构将一个整数与另一个整数进行比较? 例如。 switch(integer) { case
我有一列是“日期”类型的。如何在自定义选项中使用“之间”选项? 最佳答案 请注意,您有2个盒子。 between(在SQL中)包含所有内容,因此将框1设置为:DATE >= startdate,将框2
我有一个表,其中包含年、月和一些数字列 Year Month Total 2011 10 100 2011 11 150 2011 12 100 20
这个问题已经有答案了: Extract a substring between double quotes with regular expression in Java (2 个回答) how to
我有一个带有类别的边栏。正如你在这里看到的:http://kees.een-site-bouwen.nl/ url 中类别的 ID。带有 uri 段(3)当您单击其中一个类别时,例如网页设计。显示了一
这个问题在这里已经有了答案: My regex is matching too much. How do I make it stop? [duplicate] (5 个答案) 关闭 4 年前。 我
我很不会写正则表达式。 我正在尝试获取括号“()”之间的值。像下面这样的东西...... $a = "POLYGON((1 1,2 2,3 3,1 1))"; preg_match_all("/\((
我必须添加一个叠加层 (ImageView),以便它稍微移动到包含布局的左边界的左侧。 执行此操作的最佳方法是什么? 尝试了一些简单的方法,比如将 ImageView 放在布局中并使用负边距 andr
Rx 中是否有一些扩展方法来完成下面的场景? 我有一个开始泵送的值(绿色圆圈)和其他停止泵送的值(簧片圆圈),蓝色圆圈应该是预期值,我不希望这个命令被取消并重新创建(即“TakeUntil”和“Ski
我有一个看起来像这样的数据框(Dataframe X): id number found 1 5225 NA 2 2222 NA 3 3121 NA 我有另一个看起来
所以,我正在尝试制作正则表达式,它将解析存储在对象中的所有全局函数声明,例如,像这样 const a = () => {} 我做了这样的事情: /(?:const|let|var)\s*([A-z0-
我正在尝试从 Intellivision 重新创建 Astro-Smash,我想让桶保持在两个 Angular 之间。我只是想不出在哪里以及如何让这个东西停留在两者之间。 我已经以各种方式交换了函数,
到处检查但找不到答案。 我有这个页面,我使用 INNER JOIN 将两个表连接在一起,获取它们的值并显示它们。我有这个表格,用来获取变量(例如开始日期、结束日期和卡号),这些变量将作为从表中调用值的
我陷入了两个不同的问题/错误之间,无法想出一个合适的解决方案。任何帮助将不胜感激 上下文、FFI 和调用大量 C 函数,并将 C 类型包装在 rust 结构中。 第一个问题是ICE: this pat
我在 MySQL 中有一个用户列表,在订阅时,时间戳是使用 CURRENT_TIMESTAMP 在数据库中设置的。 现在我想从此表中选择订阅日期介于第 X 天和第 Y 天之间的表我尝试了几个查询,但不
我的输入是开始日期和结束日期。我想检查它是在 12 月 1 日到 3 月 31 日之间。(年份可以更改,并且只有在此期间内或之外的日期)。 到目前为止,我还没有找到任何关于 Joda-time 的解决
我正在努力了解线程与 CPU 使用率的关系。有很多关于线程与多处理的讨论(一个很好的概述是 this answer )所以我决定通过在运行 Windows 10、Python 3.4 的 8 CPU
我正在尝试编写 PHP 代码来循环遍历数组以创建 HTML 表格。我一直在尝试做类似的事情: fetchAll(PDO::FETCH_ASSOC); ?>
我是一名优秀的程序员,十分优秀!