类实现中Pandas DataFrame的Datetime Index出现NaT问题求助
修复类实现中Pandas DataFrame的Datetime Index变为NaT问题
在使用类Records添加第二条记录后,第一条记录的Datetime Index变为NaT,但非类实现时索引正常。需要在保留类结构的前提下修正代码。
问题原因
每次调用add方法时,执行self.dfv.set_index('moment', inplace=True)会把moment列转为索引,导致self.dfv中不再存在moment列。第二次调用add时,append操作会向没有moment列的DataFrame追加包含moment的记录,此时第一条记录的moment值为NaN,转换为datetime后就变成NaT,最终作为索引显示。
修正后的代码
from datetime import datetime import pandas as pd class Records: def __init__(self): columns = ['moment', 'val'] # 初始化时保留moment列,不设置索引 self.dfv = pd.DataFrame(columns=columns) # 提前将moment列设为datetime类型,避免重复转换 self.dfv['moment'] = pd.to_datetime(self.dfv['moment']) def add(self, moment, val): # 转换输入的moment为datetime moment_dt = pd.to_datetime(moment, format='%Y-%m-%d %H:%M:%S') # 构造单行DataFrame进行追加,避免Series的索引问题 new_rec = pd.DataFrame({'moment': [moment_dt], 'val': [val]}) # 使用concat追加,比append更高效且稳定(append已被Pandas弃用) self.dfv = pd.concat([self.dfv, new_rec], ignore_index=True) # 返回时设置索引(不修改原dfv的结构) return self.dfv.set_index('moment') if __name__ == '__main__': print('=============================Class records===================') r = Records() df = r.add('2023-11-01 10:00:00', 100.0) print(df) df = r.add('2023-11-01 11:00:00', 120.0) # Print the updated DataFrame print(df) df.info() print('=============================Single records==================') # Test first column datatime as an index columns = ['moment', 'val'] dfv = pd.DataFrame(columns=columns) dfv['moment'] = pd.to_datetime(dfv['moment']) dfv.set_index('moment', inplace=True) rec = {'moment': '2023-11-01 10:00:00', 'val': 100.0} # Convert 'moment' to datetime rec['moment'] = pd.to_datetime(rec['moment'], format='%Y-%m-%d %H:%M:%S') # Add the record to DataFrame dfv = dfv.append(rec, ignore_index=True) # Set 'moment' as the index rec2 = {'moment': '2023-11-01 11:00:00', 'val': 120.0} dfv = dfv.append(rec2, ignore_index=True) # Set 'moment' as the index dfv.set_index('moment', inplace=True) print(dfv) dfv.info() exit(0)
关键修改点
- 类初始化时,
self.dfv保留moment列,不设置索引,且提前将该列转为datetime类型 - 使用
pd.concat替代已弃用的append方法,追加逻辑更稳定 - 仅在返回结果时设置索引,不修改
self.dfv的原始结构,确保后续追加记录时moment列始终存在
内容的提问来源于stack exchange,提问作者LowCoder
相关产品推荐
相关产品推荐

