如何将包含 float 和 nan 值的 Dataframe 转换为 datetime python?

Posted

技术标签:

【中文标题】如何将包含 float 和 nan 值的 Dataframe 转换为 datetime python?【英文标题】:How to convert Dataframe containing float and nan values to 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 【参考方案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'跨度>

以上是关于如何将包含 float 和 nan 值的 Dataframe 转换为 datetime python?的主要内容,如果未能解决你的问题,请参考以下文章

缺失值(NaN 值)与填充值的重叠图

如何在 mongodb 中查找包含 NaN 值的字段的 $avg 和 $sum?

如何解决:ValueError:输入包含 NaN、无穷大或对于 dtype('float32') 来说太大的值?

在使用管道进行预处理后,如何解决“输入包含 NaN、无穷大或对于 dtype('float64') 而言太大的值”?

在 pandas 数据框中检索 NaN 值的索引

比较 2 个包含不同类型和 NaN 值的结构化数组