python pandas从日期时间提取年份:df ['year'] = df ['date'].year不起作用 [英] python pandas extract year from datetime: df['year'] = df['date'].year is not working

查看:101
本文介绍了python pandas从日期时间提取年份:df ['year'] = df ['date'].year不起作用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我通过 read_csv 导入了一个数据框,但是由于某种原因,无法从 df ['date'] 系列中提取年份或月份,尝试给出 AttributeError:系列"对象没有属性年份" :

I import a dataframe via read_csv, but for some reason can't extract the year or month from the series df['date'], trying that gives AttributeError: 'Series' object has no attribute 'year':

date    Count
6/30/2010   525
7/30/2010   136
8/31/2010   125
9/30/2010   84
10/29/2010  4469

df = pd.read_csv('sample_data.csv', parse_dates=True)

df['date'] = pd.to_datetime(df['date'])

df['year'] = df['date'].year
df['month'] = df['date'].month

更新:当我在熊猫版本0.14.1上尝试使用 df ['date'].dt 解决方案时,出现"AttributeError:'Series'对象没有属性'dt':

UPDATE: and when I try solutions with df['date'].dt on my pandas version 0.14.1, I get "AttributeError: 'Series' object has no attribute 'dt' ":

df = pd.read_csv('sample_data.csv',parse_dates=True)

df['date'] = pd.to_datetime(df['date'])

df['year'] = df['date'].dt.year
df['month'] = df['date'].dt.month

很抱歉,这个问题似乎是重复的-我希望答案会让我觉得自己像骨头一样……但是我对使用类似的类似问题的答案并没有任何运气.

Sorry for this question that seems repetitive - I expect the answer will make me feel like a bonehead... but I have not had any luck using answers to the similar questions on SO.

关注度:在Anaconda环境中,我似乎无法将熊猫0.14.1更新为较新版本,下面的每种尝试都会生成无效的语法错误.我正在使用Python 3.4.1 64位.

FOLLOWUP: I can't seem to update my pandas 0.14.1 to a newer release in my Anaconda environment, each of the attempts below generates an invalid syntax error. I'm using Python 3.4.1 64bit.

conda update pandas

conda install pandas==0.15.2

conda install -f pandas

有什么想法吗?

推荐答案

如果您运行的是最新版本的熊猫,则可以使用datetime属性

If you're running a recent-ish version of pandas then you can use the datetime attribute dt to access the datetime components:

In [6]:

df['date'] = pd.to_datetime(df['date'])
df['year'], df['month'] = df['date'].dt.year, df['date'].dt.month
df
Out[6]:
        date  Count  year  month
0 2010-06-30    525  2010      6
1 2010-07-30    136  2010      7
2 2010-08-31    125  2010      8
3 2010-09-30     84  2010      9
4 2010-10-29   4469  2010     10

编辑

您似乎正在运行较早版本的熊猫,在这种情况下,以下方法将起作用:

It looks like you're running an older version of pandas in which case the following would work:

In [18]:

df['date'] = pd.to_datetime(df['date'])
df['year'], df['month'] = df['date'].apply(lambda x: x.year), df['date'].apply(lambda x: x.month)
df
Out[18]:
        date  Count  year  month
0 2010-06-30    525  2010      6
1 2010-07-30    136  2010      7
2 2010-08-31    125  2010      8
3 2010-09-30     84  2010      9
4 2010-10-29   4469  2010     10

关于为什么没有将其解析为 read_csv 中的日期时间,您需要传递列的顺序位置( [0] ),因为当True 会尝试解析列 [1,2,3] ,请参见

Regarding why it didn't parse this into a datetime in read_csv you need to pass the ordinal position of your column ([0]) because when True it tries to parse columns [1,2,3] see the docs

In [20]:

t="""date   Count
6/30/2010   525
7/30/2010   136
8/31/2010   125
9/30/2010   84
10/29/2010  4469"""
df = pd.read_csv(io.StringIO(t), sep='\s+', parse_dates=[0])
df.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 5 entries, 0 to 4
Data columns (total 2 columns):
date     5 non-null datetime64[ns]
Count    5 non-null int64
dtypes: datetime64[ns](1), int64(1)
memory usage: 120.0 bytes

因此,如果您将参数 parse_dates = [0] 传递给 read_csv ,则无需在日期上调用 to_datetime "列.

So if you pass param parse_dates=[0] to read_csv there shouldn't be any need to call to_datetime on the 'date' column after loading.

这篇关于python pandas从日期时间提取年份:df ['year'] = df ['date'].year不起作用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆