You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

类实现中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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 16:02:09