如何将十进制时间列表转为仅含时分的datetime对象(去除年月日)
问题背景
给定十进制格式的时间戳列表:
T = [10.749957462142994, 10.90579301143351, 10.981580990083001]
已通过以下代码提取出时分字符串列表['10:44', '10:54', '10:58']:
hours = [int(x) for x in T] minutes = [(x*60) % 60 for x in T] print("%d:%02d"%(hours[0], minutes[0]), "%d:%02d"%(hours[1], minutes[1]), "%d:%02d"%(hours[2], minutes[2]))
尝试用datetime模块转换为仅含时分的datetime对象时:
from datetime import datetime DT = [] for i,t in enumerate(T): string = str("%d:%02d"%(hours[i], minutes[i])) datetime_object = datetime.strptime(string, '%H:%M') DT.append(datetime_object)
得到的结果默认带有1900年1月1日的日期信息:
DT [datetime.datetime(1900, 1, 1, 10, 44), datetime.datetime(1900, 1, 1, 10, 54), datetime.datetime(1900, 1, 1, 10, 58)]
需要得到仅包含时分的时间对象(类似datetime.datetime(10, 44)的形式)。
解决方案
首先明确:Python的datetime.datetime对象必须包含年、月、日、时、分等完整时间字段,不存在只保留时分的datetime对象,你看到的1900-01-01是strptime在缺少日期参数时自动填充的默认值。
如果只需要处理时分信息,推荐以下几种替代方案:
1. 使用datetime.time对象(推荐)
datetime.time是专门用于表示时间(不含日期)的类型,完全匹配你的需求:
from datetime import time DT = [] for h, m in zip(hours, minutes): # 将分钟的浮点数取整为整数 time_obj = time(int(h), int(round(m))) DT.append(time_obj)
执行后得到的结果:
DT [datetime.time(10, 44), datetime.time(10, 54), datetime.time(10, 58)]
2. 自定义类存储时分
如果需要更灵活的结构,可以自定义一个简单的类来仅存储时分信息:
class TimeOnly: def __init__(self, hour, minute): self.hour = hour self.minute = minute def __repr__(self): return f"TimeOnly({self.hour}, {self.minute})" DT = [TimeOnly(int(h), int(round(m))) for h, m in zip(hours, minutes)]
输出结果:
DT [TimeOnly(10, 44), TimeOnly(10, 54), TimeOnly(10, 58)]
3. 保留datetime对象,按需格式化输出
如果必须使用datetime对象,可以在需要展示或使用时,仅提取时分部分:
# 生成datetime列表(保留日期字段) from datetime import datetime DT = [] for h, m in zip(hours, minutes): time_str = f"{h}:{int(round(m)):02d}" dt_obj = datetime.strptime(time_str, '%H:%M') DT.append(dt_obj) # 仅获取时分字符串 formatted_times = [dt.strftime("%H:%M") for dt in DT] print(formatted_times) # 输出: ['10:44', '10:54', '10:58'] # 或直接访问时分属性 for dt in DT: print(dt.hour, dt.minute) # 输出对应时和分
内容的提问来源于stack exchange,提问作者emax
相关产品推荐
相关产品推荐

