熊猫dropna弄乱了日期时间索引

时间:2020-06-03 17:18:46

标签: python pandas

我正在编写一个处理数据框的函数。该数据框中的行由日期时间索引建立索引,并且该数据框中每小时有一行。 基本上,经过一些处理后,这就是我所拥有的:

                     inquinante  temperatura  precipitazioni  ...  umidita  day_of_year  day_of_week
Data                                                          ...                                   
2000-07-04 00:00:00        55.0         23.9             0.0  ...     86.8          186            1
2000-07-04 01:00:00         NaN         23.4             0.0  ...     86.2          186            1
2000-07-04 02:00:00         NaN         22.7             0.0  ...     92.5          186            1
2000-07-04 03:00:00         NaN         22.1             0.0  ...     97.5          186            1
2000-07-04 04:00:00         NaN         22.2             0.0  ...     95.9          186            1

现在,我想过滤出“ inquinante”列的值为NaN的行,因此我编写了以下代码行:

df = df.dropna(subset=["inquinante"])

但是执行后得到的内容如下:

           inquinante  temperatura  precipitazioni  ...    umidita  day_of_year  day_of_week
Data                                                 ...                                     
2014-01-31        25.0     4.700000        1.000000  ...  95.700000           31            4
2014-02-01        31.0     5.800000        0.000000  ...  94.800000           32            5
2014-02-02        20.0     6.100000        1.800000  ...  97.300000           33            6
2014-02-03        17.0     6.700000        0.600000  ...  96.300000           34            0
2014-02-04        18.0     6.600000        0.800000  ...  97.200000           35            1

为什么现在我的约会比以前多了几天而不是几个小时? 我还尝试将代码行更改为:

df = df[df.inquinante >= 0]
#or
df = df[df.inquinante.notna()]

但是这些似乎都无法解决问题。有什么办法可以解决这个问题,并防止大熊猫对日期进行分组?

预先感谢

3 个答案:

答案 0 :(得分:2)

这是当所有索引标签都将午夜或时间00:00:00作为其时间戳时的日期时间索引的自动表示。

df = pd.DataFrame({'value':np.arange(20)}, index=pd.date_range('2020-02-01', periods=20, freq='12H'))
df 

输出:

                     value
2020-02-01 00:00:00      0
2020-02-01 12:00:00      1
2020-02-02 00:00:00      2
2020-02-02 12:00:00      3
2020-02-03 00:00:00      4
2020-02-03 12:00:00      5
2020-02-04 00:00:00      6
2020-02-04 12:00:00      7
2020-02-05 00:00:00      8
2020-02-05 12:00:00      9
2020-02-06 00:00:00     10
2020-02-06 12:00:00     11
2020-02-07 00:00:00     12
2020-02-07 12:00:00     13
2020-02-08 00:00:00     14
2020-02-08 12:00:00     15
2020-02-09 00:00:00     16
2020-02-09 12:00:00     17
2020-02-10 00:00:00     18
2020-02-10 12:00:00     19

现在,让我们将所有时间都放在小时== 12的地方,只留下午夜时间戳记:

df[df.index.hour != 12]

输出:

            value
2020-02-01      0
2020-02-02      2
2020-02-03      4
2020-02-04      6
2020-02-05      8
2020-02-06     10
2020-02-07     12
2020-02-08     14
2020-02-09     16
2020-02-10     18

那仍然是一个datetimeindex,每个标签确实有一个时间戳。

df[df.index.hour != 12].index.strftime('%Y-%m-%d %H:%M:%S')

输出:

Index(['2020-02-01 00:00:00', '2020-02-02 00:00:00', '2020-02-03 00:00:00',
       '2020-02-04 00:00:00', '2020-02-05 00:00:00', '2020-02-06 00:00:00',
       '2020-02-07 00:00:00', '2020-02-08 00:00:00', '2020-02-09 00:00:00',
       '2020-02-10 00:00:00'],
      dtype='object')

答案 1 :(得分:1)

您可以尝试这样-

temp = df.reset_index()
temp = temp[temp['inquinante'].notna()].set_index('Data')

答案 2 :(得分:1)

如果仅更改日期格式,而不更改值,则始终可以按以下方式将其转换回去:

df['Date'] = df['Date'].dt.strftime('%Y-%m-%d %H:%M:%S')
相关问题