Pandas中将hh:mm:ss时间格式转换为总分钟数

碧海醫心
发布: 2025-07-21 13:46:16
原创
741人浏览过

pandas中将hh:mm:ss时间格式转换为总分钟数

本文旨在详细阐述如何在Pandas DataFrame中,高效且准确地将hh:mm:ss格式的时间字符串转换为以分钟为单位的数值。我们将探讨两种主要方法:一是使用字符串分割和Lambda函数进行手动计算,二是利用Pandas内置的to_timedelta函数进行更简洁、健壮的转换。文章将提供清晰的代码示例,并分析常见错误,帮助读者掌握在数据处理中进行时间格式转换的最佳实践。

在数据分析和处理中,我们经常会遇到需要将特定格式的时间字符串转换为数值类型以进行计算或分析的场景。例如,将hh:mm:ss(小时:分钟:秒)格式的时间转换为总分钟数,这对于计算持续时间、效率指标等非常有用。

考虑以下示例DataFrame:

import pandas as pd

df = pd.DataFrame({
    'Name': ["Jim", "Chrissy", "Billy"],
    'Time': ['1:33:04', '0:06:39', '10:00:02']
})
print("原始DataFrame:")
print(df)
登录后复制

我们的目标是创建一个新列,将Time列中的hh:mm:ss格式转换为总分钟数,例如10:00:02应转换为600.03分钟。

方法一:使用字符串分割 (str.split) 和 Lambda 函数

这种方法通过将时间字符串按冒号分割成小时、分钟和秒,然后手动进行数学运算来计算总分钟数。

常见错误分析

在尝试手动转换时,可能会遇到一些常见的错误。例如,一个常见的错误尝试是:

# 错误的尝试,会产生NameError
# df['_timemin'] = df['Time'].str.split(':').apply(lambda x: (int(x[0])*60) + int(x[1])) + int(x[2]/60)
登录后复制

这个错误尝试存在几个问题:

  1. apply方法未正确闭合: apply(lambda x: ...) 后的括号没有正确匹配,导致后续的 + int(x[2]/60) 不在 apply 的作用域内,x 自然就未定义。
  2. 数据类型转换不完整: x[2](秒数)在进行除法运算前未转换为数值类型。
  3. 索引使用不当: 即使修正了语法,x 是一个列表,x[0]、x[1]、x[2] 分别代表小时、分钟、秒,都需要正确地转换为整数再进行计算。

正确的实现

为了正确实现,我们需要确保Lambda函数内部包含了所有的计算逻辑,并且所有字符串片段都已转换为数值类型。

1. 转换为整数分钟(向下取整)

Tanka
Tanka

具备AI长期记忆的下一代团队协作沟通工具

Tanka 110
查看详情 Tanka

如果需要将秒数转换为分钟后进行向下取整(例如,60秒算作1分钟,59秒算作0分钟),可以使用整数除法 //。

df['_timemin_int'] = df['Time'].str.split(':').apply(
    lambda x: int(x[0]) * 60 + int(x[1]) + int(x[2]) // 60
)
print("\n使用str.split和apply转换为整数分钟:")
print(df)
登录后复制

2. 转换为浮点分钟

如果需要更精确的浮点分钟数,可以使用浮点除法 /。

df['_timemin_float'] = df['Time'].str.split(':').apply(
    lambda x: int(x[0]) * 60 + int(x[1]) + int(x[2]) / 60
)
print("\n使用str.split和apply转换为浮点分钟:")
print(df)
登录后复制

这种方法的优点是直观,易于理解其内部逻辑。然而,它相对繁琐,且在处理非标准时间格式时不够健壮。

方法二:利用 Pandas 的 to_timedelta 函数(推荐)

Pandas 提供了一个更强大、更推荐的工具 pd.to_timedelta,它可以将多种时间字符串格式转换为Timedelta对象。Timedelta对象表示一个时间差,我们可以轻松地从中提取总秒数,然后转换为分钟。

这种方法更符合Pandas的惯用法,代码更简洁,并且在处理各种时间格式时更健壮。

# 重新创建DataFrame以展示干净的转换
df_td = pd.DataFrame({
    'Name': ["Jim", "Chrissy", "Billy"],
    'Time': ['1:33:04', '0:06:39', '10:00:02']
})

# 将时间字符串转换为Timedelta对象
df_td['TimeDelta'] = pd.to_timedelta(df_td['Time'])

# 从Timedelta对象中提取总秒数,然后转换为分钟
df_td['_timemin_td'] = df_td['TimeDelta'].dt.total_seconds() / 60

print("\n使用pd.to_timedelta进行转换:")
print(df_td)
登录后复制

优点:

  • 简洁性: 代码量少,可读性高。
  • 健壮性: pd.to_timedelta能够智能地解析多种时间格式,甚至可以处理一些不规范的输入(通过errors参数)。
  • 性能: 对于大型数据集,Pandas的向量化操作通常比apply结合Python循环更快。
  • 功能丰富: Timedelta对象本身提供了丰富的属性和方法,方便进行进一步的时间差计算。

注意事项与总结

  1. 数据类型转换: 在进行数值计算前,务必确保将字符串转换为正确的数值类型(int或float)。这是避免TypeError或逻辑错误的关键。
  2. 精度选择: 根据实际需求选择是保留浮点精度(/)还是进行整数分钟的向下取整(//)。
  3. 推荐 pd.to_timedelta: 对于Pandas中的时间数据处理,强烈推荐使用pd.to_timedelta。它不仅代码简洁、易于维护,而且在处理复杂时间逻辑和大规模数据时表现更优。
  4. 错误处理: 如果时间列中可能存在无效或缺失值,pd.to_timedelta的errors参数非常有用。例如,pd.to_timedelta(df['Time'], errors='coerce') 会将无法解析的值转换为NaT(Not a Time),从而避免程序崩溃。

通过掌握上述方法,您可以高效、准确地在Pandas中进行时间格式的转换,为后续的数据分析奠定坚实基础。

以上就是Pandas中将hh:mm:ss时间格式转换为总分钟数的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号