首页 > 解决方案 > 在 Pandas 数据框中插入一行会将 NaN 转换为 NaT

问题描述

让我们从如下所示的数据框开始:

import datetime
import numpy as np
from dateutil import tz
from pandas import DataFrame

date1 = datetime.datetime(2021, 4, 1, 9, 15, 0, 0, tzinfo=tz.tzoffset(None, -5 * 60 * 60))
df = DataFrame({"date": [date1], "a": [1.0], "b": [2.0]})

在此数据框中,dtypes是和。现在我需要将一行插入到另一个带有值的日期。我做了这样的事情:TimeStampfloat64float64NaN

date2 = date1 + timedelta(seconds=300)
row = {"date": date2, "a": np.nan, "b": np.nan}
df = df.append(row, ignore_index=True)

我的问题是这个新行是用NaTs 而不是NaNs 插入的。数据框dtypes变成TimeStamp,objectobject. NaNs 已转换为TimeStamps,这不是我所期望的。

任何想法为什么会发生这种情况以及如何避免它?我希望NaNs 保持float在我的数据框中。

我还尝试了以下方法:

date2 = date1 + timedelta(seconds=300)
row = {"date": np.nan, "a": np.nan, "b": np.nan}
df = df.append(row, ignore_index=True)
df.iloc[0, 1] = date2

这样做,我的数据框dtypes变成object,float64float64. NaNs 仍然是数字,但现在日期是纯objects。

为了给出一些上下文,这个数据框是使用另一个连接到数据库的模块构建的,以提取两个日期之间的时间序列。这些系列中的日期有 5 分钟的间隔,但给定日期的数据可能会丢失。我必须NaN在此数据框中插入多行 s 以查找缺失的日期。

提前致谢。

标签: python-3.xpandasdataframe

解决方案


解决此问题的另一种方法是首先将您的行转换为数据框:

date2 = date1 + timedelta(seconds=300)
row = {"date": date2, "a": np.nan, "b": np.nan}
df = df.append(pd.DataFrame([row]), ignore_index=True)

我不知道为什么首先会出现这个问题


推荐阅读