【问题标题】:Slicing the year from a year-mm-dd row in Python从 Python 中的 year-mm-dd 行中切片年份
【发布时间】:2019-01-15 13:53:29
【问题描述】:

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

我尝试执行以下操作:

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['年龄'].dtype 输出: dtype('O')

提前感谢您的帮助!

【问题讨论】:

  • 谢谢,我会调查一下
  • 你能发布df['age'].dtype 显示的内容,以及列的格式是什么,我个人会转换为datetime,然后只需执行dt.year
  • 所以 df['age'].dtype 返回:dtype('O') 列的格式是 "yyyy-mm-dd" ,例如: "1967-12-25"

标签: python string pandas dataframe slice


【解决方案1】:

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

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

【讨论】:

【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-26
    • 2014-02-05
    • 1970-01-01
    • 2021-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多