我想创建一个遍历Pandas
Dataframe
的函数,并按以下格式转换所有日期变量:%b-%Y
,例如:Jun-2017
,{{ 1}},Apr-2017
等,用于每个注册表中当前年份和日期之间的差异(例如:May-2017
)。
我的功能是:
2018 - year_corresponding_to_each_registry
我遇到以下问题:
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)
Pd积。我使用以下行代码导入了datetime库:
AttributeError: module 'datetime' has no attribute 'year'
提前感谢您提供有关如何以有效方式完成此任务的任何帮助。
ANSWER
感谢@DeepSpace的回答(请在下方检查,标记为正确答案):
import datetime as dt
答案 0 :(得分:2)
你的代码过于复杂,即使它有效。
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='coerce'
传递给pd.to_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
答案 1 :(得分:0)
尝试:
import datetime as dt
import pandas as pd
df[col] = pd.to_datetime(df[col], format="%b-%Y") #Convert to date object
print(df[col].apply(lambda x: dt.datetime.now().year - x.year)) #Sub from current year.