从Python中的year-mm-dd行中切出年份

时间:2018-08-08 10:23:36

标签: python string pandas dataframe slice

我正在尝试在pandas数据框中切片一个大的对象类型的列。 此列中的所有日期均采用“ year-mm-dd”格式,我想先仅将其替换为“ year”值,然后将其转换为数字列。

我尝试执行以下操作:

for i in range(len(df.index)):
    df.age[i]=df.age[i][:4]

我直接收到警告和错误,如下所示:

/home/nbuser/anaconda3_501/lib/python3.6/site-packages/ipykernel/__main__.py:2: 
SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame

See the caveats in the documentation: http://pandas.pydata.org/pandas- 
docs/stable/indexing.html#indexing-view-versus-copy
from ipykernel import kernelapp as app
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-262-b01a66467d00> in <module>()
  1 for i in range(len(df.index)):
 ----> 2     df.age[i]=df.age[i][:4]

 IndexError: invalid index to scalar variable.

如果可以的话,我想做的就是使用以下方法将该列从对象转换为数字列:

df['age'] = pd.to_numeric(df['age'])

通过输入.to_dict提示符,我得到:

输入:     df ['age']。to_dict() 输出:     {0:'1966-04-08',1:'1965-05-14',2:'1965-08-12',3:'1968-02-15',     4:“ 1968-08-08”,...}我削减了其余部分,因为存在超过16000个值

另外,当我得到dtype时,我得到: 输入:     df ['age']。dtype 输出:     dtype('O')

提前感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

您可以尝试以下2种方法之一:

df['age'] = df['age'].astype(str).str.split('-').str[0].astype(int)
df['age'] = df['age'].astype(str).str[:4].astype(int)

答案 1 :(得分:1)

如果您的日期在“年龄”列中:

import datetime
df.loc[:,'age'] = df.loc[:,'age'].map(lambda x: datetime.datetime.strptime(str(x),'%Y-%m-%d').year)