首页 > 解决方案 > 用于选择满足特定条件的日期范围的 for 循环

问题描述

我有以下季度数据。但是有些日期没有数据。我想创建一个循环遍历索引并检查资产列中的日期是否为 NaN。如果是,则创建一个新的数据框,其中包含没有 NaN 且循环中断的数据框部分。

例如,循环在 2018 年 9 月 30 日到 2016 年 9 月 30 日之间开始,一切正常,然后在下一次迭代中有 NaN(2016 年 6 月 30 日),所以我想创建一个包含行的数据框在 2018 年 9 月 30 日到 2016 年 9 月 30 日之间,循环中断。

注意:它必须进行某种迭代,因为我想用许多 excel 来做这件事,而对于一些 excel,NaN 开始的确切日期可能在不同的时间。

date           assets   debt
9/30/2018   4193    1824
6/30/2018   4281    1929
3/31/2018   4149    1460
12/31/2017  4238    1404
9/30/2017   3804    1401
6/30/2017   3583    1437
3/31/2017   3404    1451
12/31/2016  3181    1445
9/30/2016   3622    1478
6/30/2016   NaN NaN
3/31/2016   NaN NaN
12/31/2015  2566    225
9/30/2015   NaN NaN
6/30/2015   NaN     NaN
3/31/2015   NaN NaN
12/31/2014  2917    342

这是我到目前为止所尝试的:

for date in df.index:
   if df['assets'][df.index == date].empty == True:
       newdf = df[df.index > date]
       break

标签: pythonpandasindexingtime-series

解决方案


您可以使用该numpy方法isnan提取索引,然后索引以获取其余部分。

idx = np.isnan(df.assets).idxmax() # this is one way

idx = df.assets.isna().idxmax() # this is another way

newdf = df.iloc[:idx]

         date  assets    debt
0   9/30/2018  4193.0  1824.0
1   6/30/2018  4281.0  1929.0
2   3/31/2018  4149.0  1460.0
3  12/31/2017  4238.0  1404.0
4   9/30/2017  3804.0  1401.0
5   6/30/2017  3583.0  1437.0
6   3/31/2017  3404.0  1451.0
7  12/31/2016  3181.0  1445.0
8   9/30/2016  3622.0  1478.0 

在读取文件时将其置于循环中应该是微不足道的。


推荐阅读