【问题标题】:AttributeError: 'NoneType' object has no attribute 'year' ( occurs when iterating through a list trying to convert dates )AttributeError: 'NoneType' 对象没有属性 'year' (在迭代列表试图转换日期时发生)
【发布时间】:2020-07-22 19:35:33
【问题描述】:

我正在尝试将列表中的生日转换为年龄。日期是字符串。

bday_list: ['1990-01-01', '1991-01-01', '1992-01-01']

bday_list: [30, 29, 28]

使用python3,我要转换的代码是:

for i in range(bday_list_length):

    pd.to_datetime('today').year - pd.to_datetime(bday_list[i]).year

但是,当我运行它时:我收到以下错误:

Traceback(最近一次通话最后一次): 文件“C:/Users/user/PycharmProjects/DBlytics/notebook/poc/ageData.py”,第 60 行,在 pd.to_datetime('今天').year - pd.to_datetime(bday_list[i]).year AttributeError: 'NoneType' 对象没有属性 'year'

但是,当我在循环之外运行以下内容时,它会转换。

    pd.to_datetime('today').year - pd.to_datetime(bday_list[i]).year

我不确定我做错了什么。

【问题讨论】:

  • 试试print(repr(bday_list[i])),你看到的最后一个是有问题的。例如,pd.to_datetime(None).year 会引发相同的错误。
  • 谢谢!错误与列表中的“空”条目有关。感谢您为我指明正确的方向!
  • @thehungrypanda121 - 然后使用pd.to_datetime(bday_list, errors='coerce'),检查我的答案。

标签: python pandas date


【解决方案1】:
from datetime import datetime
bday_list = ['1990-01-01', '1991-01-01', '1992-01-01']
for date in bday_list:
     print(datetime.today().year - datetime.strptime(date,'%Y-%m-%d').year)

使用日期时间,在使用 strptime() 将其转换为日期格式后,我将提取当前日期年份减去从 bday_list 中的字符串中提取的年份

【讨论】:

  • 感谢您的回复。错误出现在我的数据中。当 null 值被迭代到 pd.to_datetime(bday_list[i]).year 时,它抛出了错误。您的代码也可以工作,也更灵活。
【解决方案2】:

在处理数组的 pandas 中,只删除 [i] 并添加 errors='coerce' 以转换错误数据 - 解决方案将值转换为 NaT

bday_list = ['1990-01-01', '1991-01-01', '1992-01-01', 'wrong']

print (pd.to_datetime(bday_list, errors='coerce'))
DatetimeIndex(['1990-01-01', '1991-01-01', '1992-01-01', 'NaT'], 
dtype='datetime64[ns]', freq=None)

out = pd.to_datetime('today').year - pd.to_datetime(bday_list, errors='coerce').year
print (out)
Float64Index([30.0, 29.0, 28.0, nan], dtype='float64')

【讨论】:

    【解决方案3】:

    我建议你使用纯 python 来解决上述任务。循环浏览列表时无需调用 pandas。此外,您可以使用列表推导。

    from typing import List
    import datetime as dt
    
    
    bday_list: List[str] = ["1990-01-01", "1991-01-01", "1992-01-01"]
    bday_list_dates = [dt.datetime.strptime(x, "%Y-%m-%d") for x in bday_list]
    today = dt.date.today()
    year_of_age = [today.year - x.year for x in bday_list_dates]
    print(year_of_age)
    

    【讨论】:

      【解决方案4】:

      import datetime import pandas as pd date_list = ['1990-01-01', '1991-01-01', '1992-01-01'] date_list = [pd.to_datetime(date) for date in date_list] age_list = [int(datetime.now().strftime('%Y')) - int(date.strftime('%Y')) for date in date_list]

      很简单!!只需使用上面的代码..

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-16
        • 1970-01-01
        • 1970-01-01
        • 2021-08-19
        • 1970-01-01
        • 2019-01-01
        • 2021-12-26
        • 2019-07-23
        相关资源
        最近更新 更多