如何将包含 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
如果需要epoch
是1970-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?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 mongodb 中查找包含 NaN 值的字段的 $avg 和 $sum?
如何解决:ValueError:输入包含 NaN、无穷大或对于 dtype('float32') 来说太大的值?