看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
某员工一段时间上班打卡的时间记录如下,现在需要计算他在这期间的平均打卡时间。
# 一周打卡时间记录
ts = '''
2020-10-28 09:59:44
2020-10-29 10:01:32
2020-10-30 10:04:27
2020-11-02 09:55:43
2020-11-03 10:05:03
2020-11-04 09:44:34
2020-11-05 10:10:32
2020-11-06 10:02:37
'''
首先读取数据,并将数据类型转为时间类型,然后计算时间序列的平均值。下列代码中的 StringIO 将字符串读入内存的缓冲区,read_csv 的 parse_dates 参数传入需要转换时间类型的列名:
import pandas as pd
from io import StringIO
# 读取数据,类型设置为时间类型
df = pd.read_csv(StringIO(ts), names=['time'], parse_dates=['time'])
df
'''
time
0 2020-10-28 09:59:44
1 2020-10-29 10:01:32
2 2020-10-30 10:04:27
3 2020-11-02 09:55:43
4 2020-11-03 10:05:03
5 2020-11-04 09:44:34
6 2020-11-05 10:10:32
7 2020-11-06 10:02:37
'''
# 对时间序列求平均
df.time.mean()
# Timestamp('2020-11-02 04:00:31.500000')
我们发现,mean 方法会对时间序列的时间戳求平均值,得出的值为 11 月 2 日凌晨 4点,这和我们的需求不符,因为我们不需要关心具体是哪天,只关注时间。正确的做法是将日期归到同一天,再求平均时间。时间的 replace 方法可以实现这个功能,结合函数的调用方法,有以下三种办法可以实现同样的效果:
# 将时间归为同一天,再求平均时间
df.time.apply(lambda s: s.replace(year=2020, month=1, day=1)).mean()
df.time.apply(pd.Timestamp.replace, year=2020, month=1, day=1).mean()
df.time.transform(pd.Timestamp.replace, year=2020, month=1, day=1).mean()
# Timestamp('2020-01-01 10:00:31.500000')
前两个方法都用 apply 来调用时间的 replace 方法,第一个用 lambda 来调用,第二个直接用 pandas 的固定时间对象来调用,第三个方法用 transform 来调用函数。将时间的日期归到同一天后,再用 mean 求得平均时间为 10:00:31,就得到了该员工平均的打卡时间。
注:此案例收录在《深入浅出Pandas:利用Python进行数据处理与分析》17.2.11 小节。
(完)
更新时间:2024-08-18 16:13:55 标签:pandas python 时间