Pandas中将hh:mm:ss时间字符串转换为总分钟数教程

pandas中将hh:mm:ss时间字符串转换为总分钟数教程

本教程详细介绍了如何在Pandas DataFrame中将hh:mm:ss格式的时间字符串高效转换为总分钟数。文章将从数据准备开始,逐步讲解使用str.split结合apply方法进行转换的两种方案,包括获取整数分钟和浮点分钟,并深入分析常见错误及其修正方法,旨在帮助用户准确处理时间数据类型转换。

1. 数据准备与需求分析

在数据分析和处理中,我们经常会遇到需要将特定格式的时间字符串转换为数值型时间单位的需求。本教程的目标是将Pandas DataFrame中hh:mm:ss(时:分:秒)格式的时间列转换为以分钟为单位的总时长,可以保留小数(浮点分钟)或向下取整(整数分钟)。

首先,我们创建一个示例DataFrame:

import pandas as pd# 创建示例DataFramedf = pd.DataFrame({    'Name': ["Jim", "Chrissy", "Billy"],    'Time': ['1:33:04', '0:06:39', '10:00:02']})print("原始DataFrame:")print(df)

输出的DataFrame如下所示:

原始DataFrame:      Name      Time0      Jim   1:33:041  Chrissy   0:06:392    Billy  10:00:02

我们的目标是添加一个新列,例如_timemin,将Time列中的每个时间值转换为对应的总分钟数。例如,10:00:02应转换为600.03分钟。

2. 常见错误解析

在尝试进行此类转换时,初学者可能会遇到一些问题。以下是一个常见的错误尝试及其原因分析:

# 错误的尝试# df['_timemin'] = df['Time'].str.split(':').apply(lambda x: (int(x[0])*60) + int(x[1])) + int(x[2]/60)# 上述代码会产生 NameError: name 'x' is not defined

这个错误尝试存在以下几个关键问题:

apply方法闭合问题: 表达式 df[‘Time’].str.split(‘:’).apply(lambda x: (int(x[0])*60) + int(x[1])) 的 apply 方法在 int(x[1]) 之后就已结束。这意味着 + int(x[2]/60) 这部分代码是在 apply 方法外部执行的。lambda x作用域 由于 + int(x[2]/60) 在 apply 外部,x 这个变量(代表当前行的时间列表)在 apply 外部是未定义的,从而导致 NameError: name ‘x’ is not defined。数据类型转换: 即使 x[2] 能被访问到,它也是一个字符串(例如 “04” 或 “02”),在进行除法运算前必须先将其转换为数值类型(例如 int(x[2]))。

理解这些错误有助于我们构建正确的解决方案。

3. 解决方案详解

我们将提供两种基于str.split和apply方法的解决方案,分别用于获取整数分钟数和浮点分钟数。

3.1 获取整数分钟数(向下取整)

如果我们需要将秒数转换为分钟时进行向下取整(即忽略不足一分钟的秒数),可以使用整数除法 //。

# 方案一:转换为整数分钟数(向下取整)df_int_minutes = df.copy() # 使用副本,避免修改原始dfdf_int_minutes['_timemin_int'] = df_int_minutes['Time'].str.split(':').apply(    lambda x: int(x[0]) * 60 + int(x[1]) + int(x[2]) // 60)print("n转换为整数分钟数:")print(df_int_minutes)

代码解释:

df_int_minutes[‘Time’].str.split(‘:’):将Time列的每个字符串按 : 分割,返回一个Series,其中每个元素是一个包含小时、分钟、秒字符串的列表(例如 [‘1′, ’33’, ’04’])。.apply(lambda x: …):对Series中的每个列表 x 执行lambda函数。int(x[0]) * 60:将小时字符串(x[0])转换为整数并乘以60,得到小时对应的分钟数。int(x[1]):将分钟字符串(x[1])转换为整数。int(x[2]) // 60:将秒字符串(x[2])转换为整数,然后使用整数除法 // 将秒转换为分钟,结果向下取整。三部分相加,得到总的整数分钟数。

输出结果:

转换为整数分钟数:      Name      Time  _timemin_int0      Jim   1:33:04            931  Chrissy   0:06:39             62    Billy  10:00:02           600

3.2 获取浮点分钟数(精确到小数)

如果需要精确到小数的分钟数,则应使用浮点除法 / 将秒转换为分钟。

# 方案二:转换为浮点分钟数df_float_minutes = df.copy() # 使用副本df_float_minutes['_timemin_float'] = df_float_minutes['Time'].str.split(':').apply(    lambda x: int(x[0]) * 60 + int(x[1]) + int(x[2]) / 60)print("n转换为浮点分钟数:")print(df_float_minutes)

代码解释:此方案与整数分钟数的代码类似,唯一区别在于将秒转换为分钟时使用了浮点除法 / (int(x[2]) / 60),以保留小数部分。

输出结果:

转换为浮点分钟数:      Name      Time  _timemin_float0      Jim   1:33:04       93.0666671  Chrissy   0:06:39        6.6500002    Billy  10:00:02      600.033333

4. 进阶方法与注意事项

4.1 使用 pd.to_timedelta 的更优雅方式

虽然上述str.split结合apply的方法能够解决问题,但Pandas提供了更强大和语义化的时间处理工具。对于hh:mm:ss这种标准时间格式,推荐使用pd.to_timedelta将其转换为时间差(Timedelta)对象,然后利用Timedelta对象的属性来获取总秒数或总分钟数。这种方法通常更健壮,且能处理更多复杂的时间格式。

# 进阶方法:使用 pd.to_timedeltadf_timedelta = df.copy()df_timedelta['timedelta'] = pd.to_timedelta(df_timedelta['Time'])df_timedelta['_timemin_pd_elegant'] = df_timedelta['timedelta'].dt.total_seconds() / 60print("n使用pd.to_timedelta转换:")print(df_timedelta)

代码解释:

pd.to_timedelta(df_timedelta[‘Time’]):将Time列的字符串转换为Pandas Timedelta对象。Pandas能够智能识别hh:mm:ss格式。.dt.total_seconds():这是Timedelta Series的一个访问器,用于获取每个Timedelta对象的总秒数(浮点数)。/ 60:将总秒数除以60,得到总分钟数。

输出结果:

使用pd.to_timedelta转换:      Name      Time timedelta  _timemin_pd_elegant0      Jim   1:33:04  0 days 01:33:04            93.0666671  Chrissy   0:06:39  0 days 00:06:39             6.6500002    Billy  10:00:02 0 days 10:00:02           600.033333

可以看出,_timemin_pd_elegant列的结果与_timemin_float列完全一致,但代码更简洁、可读性更强。

4.2 注意事项总结

数据类型转换: 在进行任何数学运算之前,务必确保从字符串中提取的组件(如小时、分钟、秒)已正确转换为数值类型(int或float)。Lambda函数作用域: 使用apply(lambda x: …)时,确保所有对x元素的引用和计算逻辑都包含在lambda函数的括号内部,避免因作用域问题导致NameError。除法运算符选择: 根据业务需求选择正确的除法运算符://:整数除法,结果向下取整。适用于需要整数分钟数的场景。/:浮点除法,结果保留小数。适用于需要精确分钟数的场景。Pandas惯用方法: 对于时间数据处理,优先考虑使用Pandas内置的pd.to_timedelta、pd.to_datetime等函数,它们通常更高效、更健壮,且能处理更多边缘情况。

总结

本教程详细阐述了在Pandas中将hh:mm:ss格式时间字符串转换为总分钟数的多种方法。我们首先分析了使用str.split和apply时常见的错误,并提供了两种基于此方法的正确实现,分别用于获取整数分钟和浮点分钟。最后,我们介绍了使用pd.to_timedelta这一更符合Pandas风格的优雅解决方案。掌握这些方法将有助于您高效、准确地处理DataFrame中的时间数据,避免常见的类型转换和作用域错误。在实际项目中,推荐优先使用pd.to_timedelta以获得更好的代码可读性和鲁棒性。

以上就是Pandas中将hh:mm:ss时间字符串转换为总分钟数教程的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1366072.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月14日 04:58:09
下一篇 2025年12月14日 04:58:14

相关推荐

  • PySpark中XPath函数提取XML元素文本内容为Null的解决方案

    在PySpark中使用xpath函数从XML字符串中提取元素内容时,常见问题是返回空值数组。这是因为默认的XPath表达式仅定位到元素节点而非其内部文本。正确的解决方案是在XPath表达式末尾添加/text(),明确指示提取元素的文本内容,从而确保数据被准确解析并避免空值。 1. PySpark中X…

    2025年12月14日
    000
  • PyTorch中高效查找张量B元素在张量A中的所有索引位置

    本教程旨在解决PyTorch中查找张量B元素在张量A中所有出现索引的挑战,尤其是在面对大规模张量时,传统广播操作可能导致内存溢出。文章提供了两种优化策略:一种是结合部分广播与Python循环的混合方案,另一种是纯Python循环迭代张量B的方案,旨在平衡内存效率与计算性能,并详细阐述了它们的实现方式…

    2025年12月14日
    000
  • Python super() 关键字详解:掌握继承中的方法调用机制

    本文深入探讨Python中super()关键字的用法,重点解析其在继承和方法重写场景下的行为。通过示例代码,阐明了super()如何允许子类调用父类(或更上层)的方法,尤其是在初始化方法__init__和普通方法中的执行顺序,帮助开发者清晰理解方法解析顺序(MRO)的工作机制。 什么是 super(…

    2025年12月14日
    000
  • Python中super()关键字的深度解析与应用

    super()关键字在Python中扮演着至关重要的角色,它允许子类调用其父类(或根据方法解析顺序MRO链上的下一个类)的方法,即使子类已经重写了该方法。本文将详细探讨super()的工作原理、在继承体系中的行为,并通过示例代码演示其如何控制方法执行顺序,确保父类逻辑的正确调用,尤其是在处理方法覆盖…

    2025年12月14日
    000
  • 解决Selenium无法点击Shadow DOM内元素:以Reddit登录为例

    Selenium在自动化测试中遇到Shadow DOM内的元素时,传统的XPath或CSS选择器会失效,导致NoSuchElementException。本文以Reddit登录按钮为例,详细讲解如何通过JavaScript路径定位并与Shadow DOM中的元素进行交互,从而有效解决Selenium…

    2025年12月14日
    000
  • 深入解析NumPy与Pickle的数据存储差异及优化策略

    本文深入探讨了NumPy数组与Python列表在使用np.save和pickle.dump进行持久化时,文件大小差异的根本原因。核心在于np.save以原始、未压缩格式存储数据,而pickle在特定场景下能通过对象引用优化存储,导致其文件看似更小。教程将详细解释这两种机制,并提供使用numpy.sa…

    2025年12月14日
    000
  • 深入理解 Python super() 关键字:继承中的方法解析与调用机制

    Python中的super()关键字用于在子类中调用父类(或兄弟类)的方法,特别是在方法重写时。它确保了在继承链中正确地访问和执行上层类的方法,从而实现功能的扩展或协同。本文将详细解释super()的工作原理、方法解析顺序(MRO)及其在实际编程中的应用。 super() 关键字概述 在面向对象编程…

    2025年12月14日
    000
  • 深入理解Python列表推导式:避免副作用与高效计数实践

    Python列表推导式专为创建新列表设计,不应直接修改外部变量。本文将解释为何在列表推导式中递增全局变量会导致语法错误,并提供多种高效、符合Pythonic风格的替代方案,包括利用sum()、len()结合布尔值或条件表达式进行计数,同时优化列表构建过程,提升代码可读性和性能。 列表推导式的核心原则…

    2025年12月14日
    000
  • Python super() 关键字详解:理解继承中方法的调用顺序

    本文深入探讨 Python 中 super() 关键字的用法及其在继承体系中的作用。通过解析方法重写与调用机制,阐明 super() 如何实现协作式继承,确保子类在扩展或修改父类行为的同时,仍能正确调用父类方法,并详细解释方法执行的实际顺序。 1. 继承与方法重写基础 在面向对象编程中,继承是一种核…

    2025年12月14日
    000
  • 多样化PDF文档标题提取:从格式特征分析到智能模板系统的策略演进

    本文探讨了从海量、布局多变的PDF文档中高效提取标题的挑战。针对传统规则和基于PyMuPDF的格式特征分类方法,分析了其局限性,特别是面对复杂布局和上下文依赖时的不足。最终,文章强调了采用专业OCR系统和模板化解决方案的优势,指出其在处理大规模、异构文档时,能通过可视化模板配置和人工校对工作流,提供…

    2025年12月14日
    000
  • SQLAlchemy ORM中CTE与别名的高效使用及列访问指南

    本教程深入探讨SQLAlchemy ORM中公共表表达式(CTE)与aliased功能的协同运用。文章阐明了aliased在将CTE结果映射回ORM对象时的作用,并着重解决了直接从CTE访问列的常见困惑。核心在于理解SQLAlchemy将CTE视为一个“表”或“表表达式”,因此其列必须通过.c或.c…

    2025年12月14日
    000
  • Python列表推导式:避免副作用与高效计数实践

    Python列表推导式旨在高效创建新列表,而非执行带有副作用的操作,如直接修改外部全局变量。本文将深入探讨为何在列表推导式中尝试递增全局变量会导致语法错误,并提供多种符合Pythonic风格的解决方案,包括利用sum()和len()函数进行计数,以及如何优化数据处理流程,从而在保持代码简洁性的同时实…

    2025年12月14日
    000
  • BeautifulSoup处理命名空间标签:lxml与xml解析器的选择与实践

    本教程探讨BeautifulSoup在处理HTML/XML文档中命名空间标签(如)时遇到的常见问题及解决方案。重点分析了lxml和xml两种解析器对命名空间标签的不同处理方式,并提供了针对性的find_all方法,确保能准确提取所需元素。 命名空间标签的挑战:lxml解析器的行为 在处理复杂的HTM…

    2025年12月14日
    000
  • Python列表推导式中的外部变量修改限制与高效计数方法

    Python列表推导式旨在高效地创建新列表,而非修改外部变量。尝试在其中直接递增全局变量会导致语法错误,因为列表推导式是表达式,不支持语句式的副作用操作。要实现类似计数功能,应利用列表推导式生成一个包含特定值的列表(如1或布尔值),然后结合sum()或len()等聚合函数进行统计,从而保持代码的简洁…

    2025年12月14日
    000
  • 优化Python矩阵运算:提升与Matlab媲美的性能

    本文深入探讨了Python在处理矩阵线性方程组时常见的性能瓶颈,尤其是在与Matlab进行对比时。核心问题在于Python开发者常错误地使用矩阵求逆操作(scipy.linalg.inv)来解决线性系统,而Matlab的运算符则默认采用更高效的直接求解方法。文章详细阐述了这一差异,并提供了使用num…

    2025年12月14日
    000
  • Numpy数组与Python列表:意外的存储大小差异及其优化策略

    本文深入探讨了Numpy数组在特定场景下存储空间大于等效Python列表的现象。通过分析Numpy不进行自动压缩的特性以及Python Pickle在序列化时对对象引用的优化机制,揭示了导致这种差异的深层原因。教程将提供使用numpy.savez_compressed等方法来有效缩小Numpy数组文…

    2025年12月14日
    000
  • 如何在循环中将字典形式的超参数传递给RandomForestRegressor

    本文旨在解决在Python的scikit-learn库中,将包含多个超参数的字典直接传递给RandomForestRegressor构造函数时遇到的InvalidParameterError。核心解决方案是使用Python的字典解包运算符**,将字典中的键值对作为关键字参数传递,从而确保模型正确初始…

    2025年12月14日
    000
  • Python namedtuple序列化陷阱:pickle的命名匹配要求

    本文深入探讨了在使用Python pickle模块序列化collections.namedtuple类型时遇到的PicklingError。核心问题在于pickle在反序列化时,会尝试根据namedtuple内部定义的名称在其原始模块中查找对应的类。若namedtuple类型被赋值的变量名与其内部定…

    2025年12月14日
    000
  • 深入解析:NumPy数组与Python列表存储大小差异及优化策略

    本文旨在探讨NumPy数组在特定场景下为何可能比等效的Python列表占用更多存储空间,并提供优化NumPy数组存储大小的方法。核心在于理解NumPy的原始数据存储方式与Pickle序列化Python列表时对共享对象引用的处理机制,并介绍使用numpy.savez_compressed进行数据压缩的…

    2025年12月14日
    000
  • 如何在循环中向RandomForestRegressor传递超参数字典

    本文旨在解决在Python sklearn库中,当尝试通过循环将一个包含多个超参数的字典直接传递给RandomForestRegressor构造函数时遇到的常见InvalidParameterError。核心解决方案是利用Python的字典解包运算符**,将字典中的键值对转换为独立的关键字参数,从而…

    2025年12月14日
    000

发表回复

登录后才能评论
关注微信