代码之家  ›  专栏  ›  技术社区  ›  seanysull

使用熊猫时的奇怪行为。时间增量。总计\u秒`

  •  4
  • seanysull  · 技术社区  · 7 年前

    我有一个熊猫数据框,其中一列 Timedelta 类型我使用groupby和一个单独的月份列来创建这些组 Timdelta 到了一个月,我尝试使用 agg 函数以及 min, max, mean 时间增量 触发的列 DataError: No numeric types to aggregate

    为了解决这个问题,我尝试使用 total_seconds() 函数以及 apply() 然而,要获得列的数字表示形式,这种行为对我来说似乎很奇怪 NaT my中的值 时间增量 列已转换为 -9.223372e+09 但结果是 NaN 什么时候 总计\u秒() 用于标量,不带 应用()

    一个简单的例子:

    test = pd.Series([np.datetime64('nat'),np.datetime64('nat')])
    res = test.apply(pd.Timedelta.total_seconds)
    print(res)
    

    其产生:

    0   -9.223372e+09
    1   -9.223372e+09
    dtype: float64
    

    鉴于:

    res = test.iloc[0].total_seconds()
    print(res)
    

    产量:

    nan
    

    第二个示例的行为是需要的,因为我希望执行聚合等并传播丢失/无效的值。这是虫子吗?

    1 回复  |  直到 7 年前
        1
  •  6
  •   MaxU - stand with Ukraine    7 年前

    您应该使用 .dt.total_seconds() 方法,而不是应用 pd.Timedelta.total_seconds 功能到 datetime64[ns] 数据类型列:

    In [232]: test
    Out[232]:
    0   NaT
    1   NaT
    dtype: datetime64[ns]  # <----
    
    In [233]: pd.to_timedelta(test)
    Out[233]:
    0   NaT
    1   NaT
    dtype: timedelta64[ns]  # <----
    
    In [234]: pd.to_timedelta(test).dt.total_seconds()
    Out[234]:
    0   NaN
    1   NaN
    dtype: float64
    

    另一个演示:

    In [228]: s = pd.Series(pd.to_timedelta(['03:33:33','1 day','aaa'], errors='coerce'))
    
    In [229]: s
    Out[229]:
    0   0 days 03:33:33
    1   1 days 00:00:00
    2               NaT
    dtype: timedelta64[ns]
    
    In [230]: s.dt.total_seconds()
    Out[230]:
    0    12813.0
    1    86400.0
    2        NaN
    dtype: float64