Python 使用datetime库为多个列提取年份

Python 使用datetime库为多个列提取年份,python,datetime,dataframe,Python,Datetime,Dataframe,我想创建一个函数,该函数通过我的Pandas数据帧并将所有日期变量转换为以下格式:%b-%Y,例如:Jun-2017,Apr-2017,May-2017,等等,将当前年份与每个注册表中日期年份之间的差异(例如:2018-对应于每个注册表的年份) 我的职能是: def date_to_numeric(df): for col in dates: print("Converting date variables to years: " + col, flush = True) d

我想创建一个函数,该函数通过我的
Pandas
数据帧
并将所有日期变量转换为以下格式:
%b-%Y
,例如:
Jun-2017
Apr-2017
May-2017
,等等,将当前年份与每个注册表中日期年份之间的差异(例如:
2018-对应于每个注册表的年份

我的职能是:

def date_to_numeric(df):
  for col in dates:
    print("Converting date variables to years: " + col, flush = True)
    df[col] = df[col].apply(pd.to_datetime, format = '%b-%Y', errors = 'coerce')     
    df[col] = df[col].apply(dt.year)
  return df
我在以下方面遇到问题:

df[col] = df[col].apply(dt.year)
我收到以下错误消息:

AttributeError: module 'datetime' has no attribute 'year'
p.D.我已导入带有以下行代码的datetime库:

import datetime as dt
提前感谢您在如何高效完成此任务方面提供的任何帮助

答复

感谢@DeepSpace answer(请在下方选中标记为正确答案的复选框)


您的代码过于复杂,即使它可以工作

df = pd.DataFrame({'a': ['Jun-2017', 'Apr-2017', 'Jan-2015']})

print(df)

#            a
#   0  Jun-2017
#   1  Apr-2017
#   2  Jan-2015

df['b'] = 2018 - pd.to_datetime(df['a']).dt.year

print(df)

#             a  b
#   0  Jun-2017  1
#   1  Apr-2017  1
#   2  Jan-2015  3
这将按列运行(即需要对每个列分别执行),并且仅当列中的所有元素都可以解析为日期时才起作用。如果您的实际数据并非如此,您需要考虑到这一点(例如,通过将
errors='concurve'
传递到
pd.to\u datetime

df = pd.DataFrame({'a': ['Jun-2017', 'Apr-2017', 'Jan-2015', 'i am not a date']})
df['b'] = 2018 - pd.to_datetime(df['a'], errors='coerce').dt.year

print(df)
#                   a    b
#  0         Jun-2017  1.0
#  1         Apr-2017  1.0
#  2         Jan-2015  3.0
#  3  i am not a date  NaN

您的代码过于复杂,即使它可以工作

df = pd.DataFrame({'a': ['Jun-2017', 'Apr-2017', 'Jan-2015']})

print(df)

#            a
#   0  Jun-2017
#   1  Apr-2017
#   2  Jan-2015

df['b'] = 2018 - pd.to_datetime(df['a']).dt.year

print(df)

#             a  b
#   0  Jun-2017  1
#   1  Apr-2017  1
#   2  Jan-2015  3
这将按列运行(即需要分别对每列执行),并且仅当列中的所有元素都可以解析为日期时才起作用。如果实际数据不是这样,则需要考虑这一点(例如,通过将
errors='concurve'
传递到
pd.to\u datetime

df = pd.DataFrame({'a': ['Jun-2017', 'Apr-2017', 'Jan-2015', 'i am not a date']})
df['b'] = 2018 - pd.to_datetime(df['a'], errors='coerce').dt.year

print(df)
#                   a    b
#  0         Jun-2017  1.0
#  1         Apr-2017  1.0
#  2         Jan-2015  3.0
#  3  i am not a date  NaN
尝试:

尝试:


您希望您的时差采用什么格式?Hi@jpp numeric integer。例如,对于2017年5月的注册表,结果将是1作为数字(2018-2017=1)。谢谢您的帮助。您希望您的时差采用什么格式?Hi@jpp numeric integer。例如,对于2017年5月的注册表,结果将是1作为数字(2018-2017=1)。谢谢你的帮助。谢谢你的知识@DeepSpace,可以用你的代码行来完成。最后我在我的脚本中输入了这段代码,工作非常完美:def date_to_numeric(df):col-in-dates:print(“将日期变量转换为年份:”+col,flush=True)df[col]=df[col]。apply(pd.to_datetime,format='%b-%Y',errors='concure')df[col]=2018-df[col].apply(pd.to_datetime,errors='concure').dt.year return dft感谢您对@DeepSpace的了解,可以使用您的代码行来完成。最后,我在脚本中输入了这段代码,工作非常好:def date\u to\u numeric(df):对于col-in-dates:print(将日期变量转换为年份:“+col,flush=True)df[col]=df[col]。应用(pd.to_datetime,格式=“%b-%Y”,错误=“强制”)df[col]=2018-df[col]。应用(pd.to_datetime,错误=“强制”).dt.year return如果您不编写一个只编写代码的答案,而是详细说明一下您的thinkingHi@Rakesh,则如果我导入datetime而不后跟“as dt”,则在执行“print”行后,我会在您的解决方案后收到以下错误:。如果我导入datetime后跟“as dt”“,我在您的“print”行之后收到了以下错误:感谢您的代码。如果您不编写一个只编写代码的答案,而是详细介绍一下您的thinkingHi@Rakesh,我可能会受益更多。如果我导入datetime而不后跟“as dt”,我会在执行您的解决方案之后收到以下错误“打印”行:。如果导入datetime后跟“as dt”,则在“打印”行之后,我会收到以下错误:谢谢您的代码。