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

将pandas对象转换为timedelta会导致NaT

  •  1
  • aiquis  · 技术社区  · 7 年前

             date hour_in hour_out
    0  01/06/2016        08:15      19:37   
    1  02/06/2016        08:26      17:31   
    2  03/06/2016        08:08      21:31
    

    我正在试着转换 hour_in hour_out 使用此代码(基于此问题的答案)创建时间增量 Dates from 1900-01-01 are added to my 'Time' after using df['Time'] = pd.to_datetime(phData['Time'], format='%H:%M:%S') ):

    df['hora_entrada'] = pd.to_timedelta(df['hora_entrada'], errors='coerce')
    df['hora_saida']  = pd.to_timedelta(df['hora_saida'] , errors='coerce')
    

    转换后,我的列将转换为正确的数据类型 timedelta64[ns] ,但所有值都设置为 NaT . 我的 df.info() 返回以下内容:

    <class 'pandas.core.frame.DataFrame'>
    RangeIndex: 439 entries, 0 to 438
    Data columns (total 4 columns):
    data            439 non-null datetime64[ns]
    hour_in         0 non-null timedelta64[ns]
    hour_out        0 non-null timedelta64[ns]
    dtypes: datetime64[ns](1), timedelta64[ns](2)
    

              data hora_entrada hora_saida
    0   2016-06-01          NaT        NaT
    1   2016-06-02          NaT        NaT
    2   2016-06-03          NaT        NaT
    

    我尝试将时间列转换为 datetime 然后到 timedelta 但我得到了奇怪的结果。举个例子:

              data          hora_entrada            hora_saida
    0   2016-06-01 -25567 days +08:15:00 -25567 days +19:37:00
    1   2016-06-02 -25567 days +08:26:00 -25567 days +17:31:00
    2   2016-06-03 -25567 days +08:08:00 -25567 days +21:31:00
    

    日期时间 它被附加到日期的小时 1900-01-01 .

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

    考虑以下方法:

    In [24]: pd.to_timedelta(df.hour_in + ':00', errors='coerce')
    Out[24]:
    0   08:15:00
    1   08:26:00
    2   08:08:00
    Name: hour_in, dtype: timedelta64[ns]