如何将0至1区间的浮点数转换为小时时间格式?
我明白你遇到的问题了——把CSV里的9:30 am这类时间字符串存成Excel后,它变成了0到1之间的浮点数(本质是Excel把时间按一天的比例存储,比如9:30 AM就是9.5/24≈0.395833),直接转字符串只会得到浮点数文本,转datetime也没达到预期。下面给你几个靠谱的解决方法:
方法1:用timedelta直接转换为时间时长
这个浮点数代表的是一天的占比,我们可以直接把它转换成对应的时分秒时长,再格式化需要的时间字符串:
import pandas as pd from datetime import timedelta # 读取你的Excel数据集 df = pd.read_excel('你的文件路径.xlsx') # 把浮点数转成时分秒格式的时长 df['time_duration'] = df['hour_float'].apply(lambda x: timedelta(days=x)) # 转换成你需要的"9:30 AM"格式字符串 df['time_str'] = df['time_duration'].dt.strftime('%I:%M %p')
- 如果你需要24小时制格式,把
strftime的参数改成'%H:%M'即可。
方法2:用pandas的to_datetime对齐Excel日期系统
Excel的时间存储基于1899-12-30的历史基准,我们可以利用这个特性把浮点数转成完整datetime,再提取时间部分:
import pandas as pd df = pd.read_excel('你的文件路径.xlsx') # 按Excel的日期基准转换浮点数为datetime df['full_datetime'] = pd.to_datetime(df['hour_float'], unit='D', origin='1899-12-30') # 提取并格式化时间字符串 df['time_str'] = df['full_datetime'].dt.strftime('%I:%M %p')
这个方法适合你的数据里可能包含日期+时间的场景(浮点数大于1时代表后续日期)。
方法3:手动计算时分(自定义度更高)
如果你想更直观地控制转换逻辑,可以手动拆分小时和分钟:
import pandas as pd def float_to_time(x): total_hours = x * 24 hours = int(total_hours) minutes = int((total_hours - hours) * 60) # 处理12小时制的AM/PM period = 'AM' if hours < 12 else 'PM' # 修正0点和12点的显示逻辑 display_hour = hours if 1 <= hours <= 12 else 12 if hours == 0 else hours - 12 return f"{display_hour}:{minutes:02d} {period}" df = pd.read_excel('你的文件路径.xlsx') df['time_str'] = df['hour_float'].apply(float_to_time)
内容的提问来源于stack exchange,提问作者Ramiro Tormenta
相关产品推荐
相关产品推荐

