Python 获取此错误值错误:无法将浮点NaN转换为整数

Python 获取此错误值错误:无法将浮点NaN转换为整数,python,pandas,dataframe,Python,Pandas,Dataframe,我想,2011年12月29日这种格式的日期是字符串,我只需要年份,所以我写这个函数只提取年份,但我得到了 “ValueError:无法将浮点NaN转换为整数” 似乎我在某个地方有Nan,我能想到的唯一解决方案是用Nan删除行,但我不能这样做,因为我需要其他列的数据 def get_year(date): year = '' try: year = date[-4:] except TypeError: year = str(date)[0

我想,2011年12月29日这种格式的日期是字符串,我只需要年份,所以我写这个函数只提取年份,但我得到了
ValueError:无法将浮点NaN转换为整数” 似乎我在某个地方有Nan,我能想到的唯一解决方案是用Nan删除行,但我不能这样做,因为我需要其他列的数据

 def get_year(date):
    year = ''
    try:
        year = date[-4:]
    except TypeError:
        year = str(date)[0:4]
    return (year).astype(int)
使用此代码时,get_year函数起作用

for i in df.index:
    if (not pd.isna(df['yearOpened'][i]) and get_year(df['yearOpened'][i]) > 1955):
            print('something')
我正在使用.loc,想知道如何跳过Nan使用.loc

`df.loc[get_year(df['yearOpened'])]`

您可以使用Python内置的datetime库轻松地从字符串中获取年份

from datetime import datetime

date = '12/29/2011'
dt = datetime.strptime(date, '%m/%d/%Y') #create datetime object
dt.year

Output: 2011

您可以使用pandas.to_datetime函数,该函数将为您处理nan值

import pandas as pd
import numpy as np

dates = ['12/29/2011', '12/30/2012', np.nan]
dt = pd.to_datetime(dates)
dt.year

Output: Float64Index([2011.0, 2012.0, nan], dtype='float64')
编辑(回应评论)

要获得所有坏行的数据帧,只需从
pd.To_datetime(df['dates'],errors='concurve')
操作中索引出所有返回
NaT
的行即可

data = {'dates': ['12/29/2011', '12/30/2012', np.nan, '1/1/9999'],
        'values': [1,2,3,4]}

df = pd.DataFrame(data)
dt = pd.to_datetime(df['dates'], errors='coerce')

bad_rows = df[dt.isna()] #indexing out all rows which contain nan values
bad_rows.to_csv('bad_data.csv')

没有日期。你不能只显示一个正确的日期。抛出此错误时,传递给
get_year
的值是什么?@ifly6列'yearOpened'中的值,格式为字符串12/12/1999
ValueError Traceback(最近一次调用)在-->1 df.loc[get_year(df['yearOpened'])中的get_year(date)7 year=str(date)[0:4]8#print(year[0:4])--->9 return(year)。astype(int)
只需使用
pd.to\u datetime(您的字符串系列)解析它们
然后使用
date\u series.dt.year访问日期
感谢您,此操作有效,但出现另一个错误显然我正在使用的数据不是超级干净的
超出边界时间:超出边界纳秒时间戳:9999-12-31 00:00:00
超出边界错误如下:
def get\u year(日期):pd.to\u datetime(日期)return dt.year df.loc[get_year(df['yearbuilded'])]
有人能建议我如何处理这一错误吗,或者
def get_year(date):year=''try:year=date[-4:]除了TypeError:year=str(date)[0:4]return(year)(year)(int)
处理此问题的方法非常感谢您提前将错误设置为“强制”:
dt=pd.to_datetime(dates,errors='concurve')
。这将用NaT替换越界日期时间。不确定这是否是你想要的。我正在尝试标记数据是否有类似的问题。因此,如果数据有类似的内容,或者是空的,我需要将整行保存在不同的数据帧上,并将其导出到csv。这有意义吗?我已经用我理解的问题的解决方案编辑了答案。希望有帮助。