将时间戳导入Pandas数据框,并计算总工作时间

iecba09b  于 2023-06-28  发布在  其他
关注(0)|答案(1)|浏览(140)

好吧,我已经在这方面工作了几个小时,并试图搜索多个其他答案,但似乎无法找到我所需要的。我有一个员工的数据框架,他们在一个 *.csv文件上有可变数量的时钟和时钟,我正在导入到Pandas数据框架中。例如:
| 姓名|输入|出局|输入|出局|输入|出局|输入|出局|输入|出局|
| - -----|- -----|- -----|- -----|- -----|- -----|- -----|- -----|- -----|- -----|- -----|
| 汤姆|2023年6月12日12:05:00下午|2023年12月6日12:15:00|||||||||
| 史蒂夫|2023年12月6日下午1时00分|2023年12月6日下午5时|2023年6月13日上午9时|2023年6月13日:下午五点|||||||
| 乔恩|2023年12月6日上午9时15分|203年6月12日下午6时35分37秒|2023年6月13日上午9时01分14秒|2023年6月13日下午4时15分37秒|2023年6月24日上午11时|2023年6月24日下午7:00:15|||||
时钟输入和时钟输出的数量可以在Excel电子表格中一直进行,因此,每个名称可能有数百列。
我如何计算所有的输出与按时间戳计算,并得出总工作小时数,按人分列?在Excel中,我可以使用sumproduct并将所有的Outs相加,然后减去所有的Ins,并得出正确的答案。然而,当将该公式添加到电子表格时,速度非常慢,所以我希望将Excel中的数据导入到dataframe中,并使用Pandas计算答案。然而,我无法为我的生活弄清楚如何做到这一点。
任何建议或帮助将不胜感激。
谢谢!
克莱尔

t5zmwmid

t5zmwmid1#

你的例子中有很多错别字。所以我把它修好了

示例代码

nan = float('nan')
data1 = {'Name': {0: 'Tom', 1: 'Steve', 2: 'Jon'},
 'In': {0: '06/12/2023 12:05:00 p.m.',
  1: '06/12/2023 1:00:00 p.m.',
  2: '06/12/2023 09:00:15 a.m.'},
 'Out': {0: '06/12/2023 12:15:00 p.m.',
  1: '06/12/2023 5:00:00 p.m.',
  2: '06/12/2023 6:35:37 p.m.'},
 'In.1': {0: nan,
  1: '06/13/2023 09:00:00 a.m.',
  2: '06/13/2023 09:01:14 a.m.'},
 'Out.1': {0: nan,
  1: '06/13/2023 5:00:00 p.m.',
  2: '06/13/2023 04:15:37 p.m.'},
 'In.2': {0: nan, 1: nan, 2: '06/24/2023 11:00:00 a.m.'},
 'Out.2': {0: nan, 1: nan, 2: '06/24/2023 7:00:15 p.m.'},
 'In.3': {0: nan, 1: nan, 2: nan},
 'Out.3': {0: nan, 1: nan, 2: nan},
 'In.4': {0: nan, 1: nan, 2: nan},
 'Out.4': {0: nan, 1: nan, 2: nan}}
df = pd.DataFrame(data1)

步骤1

生成输入和输出序列并转换为日期时间

s = pd.to_datetime(df.set_index('Name').rename(columns=lambda x: x.split('.')[0]).stack())

s

Name      
Tom    In    2023-06-12 12:05:00
       Out   2023-06-12 12:15:00
Steve  In    2023-06-12 13:00:00
       Out   2023-06-12 17:00:00
       In    2023-06-13 09:00:00
       Out   2023-06-13 17:00:00
Jon    In    2023-06-12 09:00:15
       Out   2023-06-12 18:35:37
       In    2023-06-13 09:01:14
       Out   2023-06-13 16:15:37
       In    2023-06-24 11:00:00
       Out   2023-06-24 19:00:15
dtype: datetime64[ns]

第二步

计算进出差和

s.diff().xs('Out', level=1).groupby(level=0, sort=False).sum()

输出:

Name
Tom     0 days 00:10:00
Steve   0 days 12:00:00
Jon     1 days 00:50:00
dtype: timedelta64[ns]

相关问题