【问题标题】:How to convert Dataframe containing float and nan values to datetime python?如何将包含 float 和 nan 值的 Dataframe 转换为 datetime python?
【发布时间】:2021-06-28 23:41:36
【问题描述】:

我有一个数据框浮点列:

data = {'mydate': [23131.0,23131.0,np.nan,22677.0,22554.0,np.nan,23131.0]}

df = pd.DataFrame(data,columns=['mydate'])

         mydate 
0        23131.0              
1        23131.0              
2        NaN              
3        22677.0              
4        22554.0              
5        NaN              
6        23131.0              

它包含空值。我正在尝试使用以下代码将其转换为 datetime python

def dayym(unit):
    dates = {date:((epoch + datetime.timedelta(days=date))) for date in unit.unique()}
    return unit.map(dates)

df.loc[:,'mydate']= dayym(df['mydate'])

出现以下错误:

    dates = {date:((epoch + datetime.timedelta(days=date))) for date in unit.unique()}
  File "central_read.py", line 18, in <dictcomp>
    dates = {date:((epoch + datetime.timedelta(days=date))) for date in unit.unique()}
ValueError: cannot convert float NaN to integer

任何想法。在这一点上,我已经不在了。

【问题讨论】:

  • 请提供预期的MRE - Minimal, Reproducible Example。显示中间结果与预期结果的偏差。我们应该能够将您的代码块粘贴到文件中,运行它并重现您的问题。这也让我们可以在您的上下文中测试任何建议。 Include your minimal data frame 作为示例的一部分。
  • data = {'mydate': [23131.0,23131.0,np.nan,22677.0,22554.0,np.nan,23131.0]} df = pd.DataFrame(data,columns=['mydate'] )
  • 23131代表什么?它是另一个日期的相对数字吗?
  • 如果是 excel 时间格式,请参阅 Convert Excel style date with pandas

标签: python pandas datetime


【解决方案1】:

不确定什么是纪元,所以在参数origin 中使用了1900-01-01,还需要在to_datetime 中添加unit='d'errors='coerce' 以将缺失或错误的值转换为NaT

df['mydate'] = pd.to_datetime(df['mydate'], errors='coerce', unit='d', origin='1900-01-01')
print (df)    
      mydate
0 1963-05-02
1 1963-05-02
2        NaT
3 1962-02-02
4 1961-10-02
5        NaT
6 1963-05-02

如果需要epoch1970-01-01 可以使用:

df['mydate'] = pd.to_datetime(df['mydate'], errors='coerce', unit='d', origin='unix')

#default value, so should be removed
df['mydate'] = pd.to_datetime(df['mydate'], errors='coerce', unit='d')
print (df)    
      mydate
0 2033-05-01
1 2033-05-01
2        NaT
3 2032-02-02
4 2031-10-02
5        NaT
6 2033-05-01

【讨论】:

    【解决方案2】:

    要将浮点数转换为日期时间并忽略 np.nan 值,您可以使用pd.to_datetime with errors='coerce'

    import pandas as pd
    import numpy as np
    data = {'mydate': [23131.0,23131.0,np.nan,22677.0,22554.0,np.nan,23131.0]}
    df = pd.DataFrame(data)
    df['mydate'] = pd.to_datetime(df['mydate'], errors='coerce')
    print (df)
    

    这会给你:

                             mydate
    0 1970-01-01 00:00:00.000023131
    1 1970-01-01 00:00:00.000023131
    2                           NaT
    3 1970-01-01 00:00:00.000022677
    4 1970-01-01 00:00:00.000022554
    5                           NaT
    6 1970-01-01 00:00:00.000023131
    

    【讨论】:

      【解决方案3】:

      使用.dropna() 删除它们

      df['mydate'] = df['mydate'].dropna().apply(daymm)
      

      【讨论】:

      • dates = {date:((epoch + datetime.timedelta(days=date))) for date in unit.unique()} AttributeError: 'float' object has no attribute 'unique'跨度>
      猜你喜欢
      • 2021-10-16
      • 2015-05-12
      • 2019-03-23
      • 2018-02-14
      • 1970-01-01
      • 1970-01-01
      • 2016-03-12
      • 2020-09-03
      • 1970-01-01
      相关资源
      最近更新 更多