
在数据处理中,我们经常会遇到时间数据以字符串形式存在的情况,例如'hh:mm:ss'。当需要对这类时间进行数值计算,比如将其转换为总分钟数时,就需要进行格式转换。本教程将指导您如何在pandas dataframe中高效且准确地完成这一任务。
假设我们有如下DataFrame,其中Time列为hh:mm:ss格式:
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)输出:
原始DataFrame:
Name Time
0 Jim 1:33:04
1 Chrissy 0:06:39
2 Billy 10:00:02我们的目标是创建一个新列_timemin,将Time列转换为对应的总分钟数,例如10:00:02应转换为600.03分钟。
在尝试转换时,用户可能会遇到一些常见的错误。例如,以下代码尝试使用str.split和apply函数进行转换,但会产生NameError:
# 错误的尝试,会引发 NameError
# df['_timemin'] = df['Time'].str.split(':').apply(lambda x: (int(x[0])*60) + int(x[1])) + int(x[2]/60)此代码存在以下几个主要问题:
这种方法直接将时间字符串分割成小时、分钟和秒,然后通过数学公式计算总分钟数。
import pandas as pd
df = pd.DataFrame({'Name': ["Jim", "Chrissy", "Billy"], 'Time': ['1:33:04', '0:06:39', '10:00:02']})
# 1. 计算总分钟数(秒数部分进行整数除法,即向下取整)
# 公式:小时 * 60 + 分钟 + 秒 // 60
df['_timemin_int_sec'] = df['Time'].str.split(':').apply(lambda x: int(x[0]) * 60 + int(x[1]) + int(x[2]) // 60)
print("\n使用整数秒数计算的总分钟数:")
print(df)
# 2. 计算总分钟数(秒数部分进行浮点除法,保留小数)
# 公式:小时 * 60 + 分钟 + 秒 / 60
df['_timemin_float_sec'] = df['Time'].str.split(':').apply(lambda x: int(x[0]) * 60 + int(x[1]) + int(x[2]) / 60)
print("\n使用浮点秒数计算的总分钟数:")
print(df)输出:
使用整数秒数计算的总分钟数:
Name Time _timemin_int_sec
0 Jim 1:33:04 93
1 Chrissy 0:06:39 6
2 Billy 10:00:02 600
使用浮点秒数计算的总分钟数:
Name Time _timemin_float_sec
0 Jim 1:33:04 93.066667
1 Chrissy 0:06:39 6.650000
2 Billy 10:00:02 600.033333原理分析:
对于时间数据处理,Pandas提供了强大的Timestamp和Timedelta对象,它们能够更健壮、更高效地处理时间相关的计算。将时间字符串转换为Timedelta对象是更专业和推荐的做法。
import pandas as pd
df = pd.DataFrame({'Name': ["Jim", "Chrissy", "Billy"], 'Time': ['1:33:04', '0:06:39', '10:00:02']})
# 将时间字符串转换为Timedelta对象
df['Time_timedelta'] = pd.to_timedelta(df['Time'])
# 提取总秒数并转换为总分钟数
df['_timemin_timedelta'] = df['Time_timedelta'].dt.total_seconds() / 60
print("\n使用Timedelta转换的总分钟数:")
print(df)输出:
使用Timedelta转换的总分钟数:
Name Time Time_timedelta _timemin_timedelta
0 Jim 1:33:04 0 days 01:33:04 93.066667
1 Chrissy 0:06:39 0 days 00:06:39 6.650000
2 Billy 10:00:02 0 days 10:00:02 600.033333原理分析:
这种方法不仅代码更简洁,而且在处理更复杂的时间格式或需要进行时间段加减运算时,也更具通用性和鲁棒性。
df_err = pd.DataFrame({'Time': ['1:33:04', 'invalid_time', '0:06:39']})
df_err['Time_timedelta'] = pd.to_timedelta(df_err['Time'], errors='coerce')
df_err['_timemin'] = df_err['Time_timedelta'].dt.total_seconds() / 60
print("\n处理无效时间数据:")
print(df_err)本教程详细
以上就是Pandas中将'hh:mm:ss'时间格式转换为总分钟数的教程的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号