我有两个数据框如下所示:
df1 =
index value
2014-05-21 09:30:00 0.0
2014-05-21 10:00:00 10.0
2014-05-21 10:30:00 3.0
.....
2017-07-10 22:30:00 18.3
2017-07-10 23:00:00 7.6
2017-07-10 23:30:00 0.0
长度等于 55037 ,另一个
df2 =
index value
2014-05-21 09:00:00 0.0
2014-05-21 10:00:00 13.0
.....
2017-07-10 21:00:00 1.6
2017-07-10 22:00:00 32.1
2017-07-10 23:00:00 7.6
长度等于 27519 ,上面的两个数据帧是groupby,具有不同的时间步长,现在我想匹配时间步在开头和结尾自动
例如, df1 中缺少“2014-05-21 09:00:00”,如何编写函数,将 df1 放入其中会检查开头和结尾是否匹配 df2 ,然后返回一个新的 df1 ,它在开头和结尾等于 df2 ,值等于零。
所以最后新的df1如下所示,
new_df1 =
index value
2014-05-21 09:00:00 0.0
2014-05-21 09:30:00 0.0
2014-05-21 10:00:00 10.0
2014-05-21 10:30:00 3.0
.....
2017-07-10 22:30:00 18.3
2017-07-10 23:00:00 7.6
2017-07-10 23:30:00 0.0
且长度等于 55038 (确保它是 df2 的两倍)
有人有想法吗?谢谢你!
答案 0 :(得分:1)
您可以选择df1,其中索引与df2的开头和结尾匹配。
df1.loc[beginning(df2):end(df2)]
您需要确保df1的项目确实正确,因为它将按顺序返回开头和结尾之间的位置。如果时间戳是日期时间对象,则在调用df1.sort_index()时将正确排序。您还可以通过调用df2.index.min()和df2.index.min()
来获取df2的开头和结尾如果时间戳是字符串,但您可以确定这些项目是有序的,您仍然可以使用.loc进行选择。否则,您将要将它们转换为datetime对象。
答案 1 :(得分:1)
如果需要添加df2.index
需要combine_first
df = df1.combine_first(df2)
print (df)
value
2014-05-21 09:00:00 0.0 <- value not exist in df1, used df2 value
2014-05-21 09:30:00 0.0
2014-05-21 10:00:00 10.0 <-value exist in both df, used df1 value
2014-05-21 10:30:00 3.0
2017-07-10 21:00:00 1.6
2017-07-10 22:00:00 32.1
2017-07-10 22:30:00 18.3
2017-07-10 23:00:00 7.6
2017-07-10 23:30:00 0.0