前言
本例中,有一些时间段数据,需要将这些时间段里的时间以小时为分组,将24个小时段中每个小时所占用的秒数计算出来。
需求:
以第一条数据为例,它所在两个小时,7点段占用24分钟15秒,8点段54分钟41秒。其他数据同理进行解析计算,最后按小时段合并,最终计算出各个小时段的用时。
思路:
-
用pd.read_clipboard读取数据df,并将列解析为时间类型
-
编写一个函数用于将时段解析为不同小时的秒数:
-
用pd.period_range将开始时间和结束时间构建一个周期对象,单位为秒
-
对周期数据用秒做groupby分组
-
用分组的items方法取出key和value,key是小时,value时长
-
用字典推导式将各个小时拼为一个字典,key是小时,value取秒
df按行调用上边的函数,每行数据会自成一个上述函数组成的字典
最后将所有字典按key合并,相加得到总的秒数,最终得到结果
还可以对其进行可视化分析
二、使用步骤
1.引入库
代码如下(示例):
import pandas as pd
2.读入数据
代码如下(示例):
'''
start_time,end_time
2/2/2021 07:24:15,2/2/2021 08:54:41
2/3/2021 11:00:05,2/3/2021 15:10:37
2/1/2021 10:40:34,2/1/2021 14:43:50
2/4/2021 10:37:37,2/4/2021 11:19:17
2/3/2021 20:37:51,2/4/2021 02:37:52
2/3/2021 21:37:52,2/3/2021 22:08:39
'''
# 读取剪贴板,用逗号分隔,解析两个字段为时间类型
df = pd.read_clipboard(sep=',', parse_dates=[0,1])#parse_dates(动词,主动解析格式),尝试解析0,1列为时间格式
# 查看类型
df.dtypes
# 函数,将开始时间和结束时间解析为每个小时的时长(秒)
def duration_by_hour(start, end):
p = pd.period_range(pd.Period(start, freq='s'), pd.Period(end, freq='s'))
pr = {h:pd.to_timedelta(t[-1]-t[0]).seconds for h,t in p.groupby(p.hour).items()}
return pr
# 将每行数据应用函数,解析出每个小时对应的秒数
s = df.apply(lambda r: duration_by_hour(r.start_time, r.end_time), axis=1)
s
# 按小时合并秒数
final = {}
for d in s.to_list():
for k in d.keys():
final[k] = final.get(k,0) + d[k]
final
# 可视化,单位转换为分钟
(pd.Series(final).sort_index()/60).plot.bar()
总结
以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。