【问题标题】:Got this Error ValueError: cannot convert float NaN to integer得到这个错误 ValueError: cannot convert float NaN to integer
【发布时间】:2020-06-12 00:26:16
【问题描述】:

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

 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'])]`

【问题讨论】:

  • 没有日期。你不能只是出现一个正确的日期。抛出此错误时将什么值传递给get_year
  • @ifly6 列 'yearOpened' 中的值以这些格式作为字符串 1999 年 12 月 12 日
  • ValueError Traceback (most recent call last) <ipython-input-194-92a26aa153b4> in <module> ----> 1 df.loc[get_year(df['yearOpened'])] <ipython-input-190-271b55d3efdf> in get_year(date) 7 year = str(date)[0:4] 8 # print(year[0:4]) ----> 9 return (year).astype(int)
  • 只需使用pd.to_datetime(your_string_series) 解析它们,然后使用date_series.dt.year 访问日期

标签: python pandas dataframe


【解决方案1】:

您可以使用 Python 的内置日期时间库轻松地从字符串中获取年份。

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')

编辑(响应 cmets)

要获取所有坏行的 DataFrame,您可以简单地索引出从 pd.to_datetime(df['dates'], errors='coerce') 操作返回 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')

【讨论】:

  • 谢谢你这工作但得到另一个错误显然我正在使用的数据不是超级干净OutOfBoundsDatetime: Out of bounds nanosecond timestamp: 9999-12-31 00:00:00
  • 出现了超出范围的错误:def get_year(date): pd.to_datetime(date) return dt.year df.loc[get_year(df['yearBuilt'])] 谁能建议我如何处理这个错误或def get_year(date): year = '' try: year = date[-4:] except TypeError: year = str(date)[0:4] return (year).astype(int) 处理 Nan 的方法 提前非常感谢
  • 您可以将错误设置为“强制”:dt = pd.to_datetime(dates, errors='coerce')。这将用 NaT 替换超出范围的日期时间。不知道这是否是你想要的。
  • 我正在尝试标记数据是否有类似的时髦。因此,如果数据有类似的东西或者它是空的,我需要将整行保存在不同的数据框中并将其导出到 csv。这有意义吗?
  • 据我所知,我已经用解决您的问题的方法编辑了答案。希望对您有所帮助。
猜你喜欢
  • 2020-03-28
  • 1970-01-01
  • 2022-12-02
  • 2021-11-19
  • 2020-10-28
  • 1970-01-01
  • 2019-11-10
  • 2016-12-06
  • 1970-01-01
相关资源
最近更新 更多