向带有日期时间索引的数据框中插入行

17

我有一个具有日期时间索引的数据帧:

time                count  day hour  minute  label
2018-06-07 00:25:00 207    7.0 0.0   25.0    177.0
2018-06-07 00:55:00 187    7.0 0.0   55.0    150.0
2018-06-07 01:25:00 194    7.0 1.0   25.0    165.0
2018-06-07 01:55:00 176    7.0 1.0   55.0    175.0
2018-06-07 02:25:00 195    7.0 2.0   25.0    172.0
-> add new datetime record record here 

我正在尝试添加一些新记录,但是遇到了这个问题:

[DatetimeIndex(['2018-06-07 01:55:00'], dtype='datetime64[ns]', name='time', freq=None)] not an index
# this happen even if row exists or not

我只想添加一个30分钟的时间间隔记录,我的代码大概是这样的:

last_date = recent_posts.iloc[[-1]].index
last_date = last_date + timedelta(minutes=30)

recent_posts.iloc[[last_date]] = # bla #bla

# What I may be doing wrong?

1
你正在寻找不在数据框中的 last_date DatetimeIndex。 - harvpan
当"recent_posts.iloc[[-1]].index"给出最后一个元素时,它是正确的。然而,我认为重要的是索引不存在,我想插入一行新数据!如果我错了,请纠正我。 - Freddy
1个回答

19

插入新记录的正确方法是:

df.append(pd.DataFrame(index=[last_date]))

例子:

print(df)

输出:

                   count    day hour    minute  label
time                    
2018-06-07 00:25:00 207 7.0 0.0 25.0    177.0
2018-06-07 00:55:00 187 7.0 0.0 55.0    150.0
使用.append()来添加元素:
df.append(pd.DataFrame(index=[last_date]))

输出:

                     count  day  hour  label  minute
2018-06-07 00:25:00  207.0  7.0   0.0  177.0    25.0
2018-06-07 00:55:00  187.0  7.0   0.0  150.0    55.0
2018-06-07 01:25:00    NaN  NaN   NaN    NaN     NaN

正如你所看到的,它使用定义的索引添加新记录,由于我们没有为其他列指定值,因此它们为NaN

您可以使用类似这样的dict指定一个或多个列的值:

data = {'hour':10} 
df.append(pd.DataFrame(data, index=[last_date]))

输出:

                     count  day  hour  label  minute
2018-06-07 00:25:00  207.0  7.0   0.0  177.0    25.0
2018-06-07 00:55:00  187.0  7.0   0.0  150.0    55.0
2018-06-07 01:25:00    NaN  NaN   10.0    NaN     NaN

2
超级感谢Harv!我看到的示例几乎总是使用concat或直接更改索引。 - Freddy
1
很高兴能够帮助。@Freddy - harvpan
我在一些地方看到过 append 会复制数据框,而更有效的方法是使用 .loc[],但是当我使用 df.loc[last_date] = data 时,出现了错误 ValueError: cannot set a row with mismatched columns。你知道如何让它以这种方式工作吗?谢谢。 - Confounded
1
@PS 看起来你需要将使用.append创建的对象分配给另一个变量,因为.append会进行原地修改,所以数据不会被保存。这一点从你的帖子中并不清楚。 - Confounded
@Confounded,我已经添加了官方文档的链接。无法在答案中涵盖函数的每个方面,因此提供官方文档链接。很高兴看到您自己找到了解决方法。 - harvpan
你尝试过使用 df['2018-06-07 01:25:00'] 访问新值吗?即使在索引后使用 pd.to_datetime,它仍会返回 KeyError。 - user3661992

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接