【问题标题】:Python pandas - Replace NaN values of column by mean of two datetime64[ns] columnsPython pandas - 用两个 datetime64[ns] 列替换列的 NaN 值
【发布时间】:2021-09-24 01:26:23
【问题描述】:

我在计算 2 个datetime64[ns] 列的平均值时遇到问题。

数据框如下所示:

data ={
        'time1' :['2019-05-21 08:29:55','2019-10-07 17:43:09','2020-12-13 21:53:00','2018-04-17 16:51:23','2016-08-31 17:40:49'],
        'time2':['2019-05-21 09:29:40', '2019-10-07 19:42:50', '2020-12-13 22:44:00', '2018-04-17 17:50:46', '2016-08-31 18:10:49'],
        'Avg_time[(time1+time2)/2]':[np.NaN,np.NaN,np.NaN,np.NaN,np.NaN]
      }
df =pd.DataFrame(data)
df

输出:

          time1                time2            Avg_time[(time1+time2)/2]
0   2019-05-21 08:29:55  2019-05-21 09:29:40         NaN
1   2019-10-07 17:43:09  2019-10-07 19:42:50         NaN
2   2020-12-13 21:53:00  2020-12-13 22:44:00         NaN
3   2018-04-17 16:51:23  2018-04-17 17:50:46         NaN
4   2016-08-31 17:40:49  2016-08-31 18:10:49         NaN

我希望将Avg_time[(time1+time2)/2] 列的NaN 值替换为time1time2 列的平均值。

注意:time1 和 time2 列的类型为 datetime64[ns](可以使用 to_datetime() 转换)。

【问题讨论】:

    标签: python pandas datetime timestamp nan


    【解决方案1】:

    您可以将日期时间转换为原生格式ns,方法是通过DataFrame.to_numpy 转换并转换为np.int64,然后转换为mean,最后返回日期时间并用Series.fillna 替换缺失值:

    df['time1'] = pd.to_datetime(df['time1'])
    df['time2'] = pd.to_datetime(df['time2'])
    
    arr = df[['time1','time2']].to_numpy().astype(np.int64).mean(axis=1)
    df['Avg_time'] = df['Avg_time'].fillna(pd.Series(pd.to_datetime(arr), index=df.index))
    print (df)
                    time1               time2                Avg_time
    0 2019-05-21 08:29:55 2019-05-21 09:29:40 2019-05-21 08:59:47.500
    1 2019-10-07 17:43:09 2019-10-07 19:42:50 2019-10-07 18:42:59.500
    2 2020-12-13 21:53:00 2020-12-13 22:44:00 2020-12-13 22:18:30.000
    3 2018-04-17 16:51:23 2018-04-17 17:50:46 2018-04-17 17:21:04.500
    4 2016-08-31 17:40:49 2016-08-31 18:10:49 2016-08-31 17:55:49.000
    

    替代方案:

    df['time1'] = pd.to_datetime(df['time1'])
    df['time2'] = pd.to_datetime(df['time2'])
    
    t1 = df['time1'].to_numpy().astype(np.int64)
    t2 = df['time2'].to_numpy().astype(np.int64)
    df['Avg_time'] = df['Avg_time'].fillna(pd.Series((t1 + t2) / 2, index=df.index))
    

    【讨论】:

    • 您的解决方案非常好。我有一个问题要问你,如果它只有几个 NaN 值,你会用什么替换第 3 列中的 NaN 值。
    • @Abhi - 你现在能检查一下吗?
    猜你喜欢
    • 2020-11-05
    • 1970-01-01
    • 2020-04-28
    • 1970-01-01
    • 2020-10-17
    • 1970-01-01
    • 2021-03-08
    • 1970-01-01
    • 2018-12-22
    相关资源
    最近更新 更多