Pandas遍历datetime.time列报错及多格式时间标准化问题
问题1:如何遍历DataFrame中存储datetime.time类型的列?
你遇到的cannot unpack non-iterable 'datetime.time' object错误原因很明确:
- 第一个循环
for index, time in df['Time']:df['Time']是Pandas Series,迭代时每个元素是单独的datetime.time对象,并非(index, value)元组,因此无法解包。 - 第二个循环
enumerate(df['Time'])虽能拿到索引和值,但直接拼接time + " " + index会报错——time是datetime.time对象、index是整数,都不能直接与字符串相加。
正确遍历方式
若要遍历索引和时间值,可使用Series.items()方法:
import pandas as pd df = pd.read_excel("some/file.xls") for index, time_val in df['Time'].items(): # 将时间对象、索引转为字符串后拼接输出 print(f"{time_val} {index}")
或用enumerate并处理类型转换:
for idx, time_val in enumerate(df['Time']): print(f"{time_val} {idx}")
给无毫秒的时间添加.000000
无需手动遍历,用Pandas矢量化操作更高效:
def format_time(t): # 通过microsecond属性判断是否有毫秒部分 if t.microsecond == 0: return f"{t.strftime('%H:%M:%S')}.000000" else: return t.strftime('%H:%M:%S.%f') df['Formatted_Time'] = df['Time'].apply(format_time)
也可用更简洁的lambda写法:
df['Formatted_Time'] = df['Time'].apply( lambda t: t.strftime('%H:%M:%S.%f') if t.microsecond != 0 else f"{t.strftime('%H:%M:%S')}.000000" )
问题2:处理datetime.time类型的多格式时间转换
Excel中公式计算得到的时间是datetime.time对象,并非字符串,因此你之前判断'.' in date的方法完全不适用——date是时间对象,不是字符串。
正确处理方式
我们可以直接通过datetime.time对象的microsecond属性判断是否包含毫秒,再进行转换:
如果要转成datetime.datetime类型:
from datetime import datetime, date def time_to_datetime(t): # 将时间对象与基准日期组合为datetime dt = datetime.combine(date.today(), t) if t.microsecond == 0: # 转成带.000000的字符串后再转回datetime return datetime.strptime(dt.strftime('%Y-%m-%d %H:%M:%S.000000'), '%Y-%m-%d %H:%M:%S.%f') else: return dt df['Datetime'] = df['Time'].apply(time_to_datetime)
如果仅需要格式化后的字符串,直接使用问题1中的format_time函数即可,它会自动处理两种情况,输出统一格式的字符串。
另外,读取Excel时若想直接处理时间列,可尝试指定parse_dates参数,但由于Excel时间本质是数值类型,Pandas仍会自动转为datetime.time,因此后续处理更可靠。
内容的提问来源于stack exchange,提问作者kristyna
相关产品推荐
相关产品推荐

