Pandas筛选后FN_CTime列不显示毫秒的问题求助
问题分析:Pandas筛选后时间戳毫秒显示异常的原因
问题描述
在Python 3.11 + Pandas 2.1.3环境下读取带毫秒的.xlsx时间戳列(FN_CTime、FN_ATime、FN_MTime、FN_RTime,Excel格式为dd/mm/aaaa hh:mm:ss,000)时出现以下异常:
- 未执行筛选时,4列均能正常显示毫秒
- 筛选出毫秒为
.000的行后,仅FN_CTime列不再显示毫秒 - 若将
FN_CTime从筛选条件中移除,则FN_CTime和FN_ATime都不再显示毫秒 - 原.xlsx文件本身无异常
相关代码:
def function(): pd.set_option("display.precision", 6) data = pd.read_excel("file.xlsx", index_col=[0], usecols=['HEADER_MFTREcordNumber', 'FN_ParentReferenceNo', 'FN_FileName', 'FilePath', 'HEADER_Flags', 'FN_CTime', 'FN_ATime', 'FN_MTime', 'FN_RTime']) #print(data) condition = data[['FN_CTime', 'FN_ATime', 'FN_MTime', 'FN_RTime']].astype(str).apply(lambda x: x.str.endswith(".000")) filtered_data = data[condition.any(axis=1)] print(filtered_data)
核心原因
这是Pandas的时间戳显示逻辑与筛选后列数据特征变化共同导致的:
- 时间戳存储与显示分离:Pandas的
datetime64[ns]类型会完整存储毫秒信息,但显示时会自动省略末尾的.000——只有当列中存在非零毫秒的行时,为了保持列格式统一,才会强制显示所有行的毫秒部分。 - 筛选逻辑触发的格式变化:
- 你的筛选条件
condition.any(axis=1)是筛选任意一列毫秒为.000的行,并非只保留所有列都是.000的行。 - 第一次筛选包含
FN_CTime时,FN_ATime/FN_MTime/FN_RTime中仍存在非零毫秒的行,因此这三列保持毫秒显示;而FN_CTime筛选后所有行的毫秒都是.000,所以被自动省略。 - 移除
FN_CTime的筛选条件后,FN_CTime和FN_ATime的剩余行全为.000,因此两者都省略了毫秒显示。
- 你的筛选条件
验证与解决方法
验证方式
毫秒信息并未丢失,只是被隐藏了,可通过以下代码确认:
# 查看FN_CTime列的原始毫秒值 print(filtered_data['FN_CTime'].dt.microsecond)
输出会显示所有行的毫秒为0,证明数据本身是完整的。
强制显示毫秒
如果需要强制所有时间戳列显示毫秒,可统一格式化输出:
time_cols = ['FN_CTime', 'FN_ATime', 'FN_MTime', 'FN_RTime'] # 格式化到毫秒级别 filtered_data[time_cols] = filtered_data[time_cols].apply(lambda x: x.dt.strftime('%d/%m/%Y %H:%M:%S.%f').str[:-3]) print(filtered_data)
内容的提问来源于stack exchange,提问作者Kuritsu
相关产品推荐
相关产品推荐

