【问题标题】:Remove dtype datetime NaT删除 dtype 日期时间 NaT
【发布时间】:2014-09-28 06:58:52
【问题描述】:

我正在准备一个 pandas df 用于输出,并希望删除表格中的 NaN 和 NaT,并将这些表格位置留空。一个例子是

mydataframesample 

col1    col2     timestamp
a       b        2014-08-14
c       NaN      NaT

会变成

col1    col2     timestamp
a       b        2014-08-14
c       

大部分值都是 dtypes 对象,时间戳列是 datetime64[ns]。为了解决这个问题,我尝试使用熊猫的mydataframesample.fillna(' ') 来有效地在该位置留出空间。但是,这不适用于日期时间类型。为了解决这个问题,我正在尝试将时间戳列转换回对象或字符串类型。

是否可以在不进行类型转换的情况下删除 NaN/NaT?如果没有,我该如何进行类型转换(尝试了 str() 和 astype(str) 但 datetime 是原始格式有困难)?

【问题讨论】:

  • 我不认为你可以像你发现的那样替换日期时间NaTNaN/NaT's 有什么问题?
  • “输出”是什么意思?在某些情况下(例如保存为 CSV)NaN/NaT 将自动填充空白。
  • 我正在转换为 html,并将其作为电子邮件发送。 NaN/NaT 是否仍会自动填充空白@chrisb?

标签: python pandas


【解决方案1】:

我遇到了同样的问题:这一切都是使用 pandas 应用功能完成的。应该是最快的方法。

import pandas as pd
df['timestamp'] = df['timestamp'].apply(lambda x: x.strftime('%Y-%m-%d')if not pd.isnull(x) else '')

如果您的时间戳字段还不是datetime 格式,那么:

import pandas as pd
df['timestamp'] = pd.to_datetime(df['timestamp']).apply(lambda x: x.strftime('%Y-%m-%d')if not pd.isnull(x) else '')

【讨论】:

    【解决方案2】:

    这不会赢得任何速度奖,但如果 DataFrame 不太长,使用列表推导式重新分配就可以了:

    df1['date'] = [d.strftime('%Y-%m-%d') if not pd.isnull(d) else '' for d in df1['date']]
    

    import numpy as np
    import pandas as pd
    Timestamp = pd.Timestamp
    nan = np.nan
    NaT = pd.NaT
    df1 = pd.DataFrame({
        'col1': list('ac'),
        'col2': ['b', nan],
        'date': (Timestamp('2014-08-14'), NaT)
        })
    
    df1['col2'] = df1['col2'].fillna('')
    df1['date'] = [d.strftime('%Y-%m-%d') if not pd.isnull(d) else '' for d in df1['date']]
    
    print(df1)
    

    产量

      col1 col2        date
    0    a    b  2014-08-14
    1    c                 
    

    【讨论】:

      【解决方案3】:

      @unutbu 的回答可以正常工作,但如果您不想修改 DataFrame,您可以这样做。 to_html 接受一个参数来表示 NaN 的表示方式,要处理 NaT 您需要传递自定义格式函数。

      date_format = lambda d : pd.to_datetime(d).strftime('%Y-%m-%d') if not pd.isnull(d) else ''
      
      df1.to_html(na_rep='', formatters={'date': date_format})
      

      【讨论】:

        【解决方案4】:

        如果您只想转换为字符串:

        In [37]: df1.to_csv(None,sep=' ')
        Out[37]: ' col1 col2 date\n0 a b "2014-08-14 00:00:00"\n1 c  \n'
        

        用字符串替换缺失值

        In [36]: df1.to_csv(None,sep=' ',na_rep='missing_value')
        Out[36]: ' col1 col2 date\n0 a b "2014-08-14 00:00:00"\n1 c missing_value missing_value\n'
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-12-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-11-23
          • 2022-11-21
          • 2018-08-20
          相关资源
          最近更新 更多