python pandas从datetime中提取年份--- df ['year'] = df ['date'].年份不起作用

MJS*_*MJS 56 python datetime extract dataframe pandas

对于这个似乎重复的问题我很抱歉 - 我希望答案会让我觉得自己像个傻瓜......但是我没有运气使用SO上类似问题的答案.

我正在导入数据read_csv,但由于某些我无法弄清楚的原因,我无法从数据帧系列中提取年份或月份df['date'].

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
Run Code Online (Sandbox Code Playgroud)

但这回归:

AttributeError:'Series'对象没有属性'year'

提前致谢.

更新:

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
Run Code Online (Sandbox Code Playgroud)

这会生成相同的"AttributeError:'Series'对象没有属性'dt'"

跟进:

我使用Spyder 2.3.1和Python 3.4.1 64位,但无法将pandas更新到更新的版本(目前在0.14.1上).以下每个都会生成无效的语法错误:

conda update pandas

conda install pandas==0.15.2

conda install -f pandas
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

EdC*_*ica 92

如果您正在运行最近版本的pandas,那么您可以使用datetime属性dt来访问datetime组件:

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
Run Code Online (Sandbox Code Playgroud)

编辑

看起来你正在运行旧版本的pandas,在这种情况下,以下内容可以正常工作:

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
Run Code Online (Sandbox Code Playgroud)

关于为什么它没有将它解析为日期时间read_csv你需要传递column([0])的序号位置,因为当True它试图解析列时,[1,2,3]请参阅文档

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
Run Code Online (Sandbox Code Playgroud)

因此,如果你传递param parse_dates=[0],read_csv那么to_datetime加载后就不需要调用'date'列.


Mik*_*ler 10

这有效:

df['date'].dt.year
Run Code Online (Sandbox Code Playgroud)

现在:

df['year'] = df['date'].dt.year
df['month'] = df['date'].dt.month
Run Code Online (Sandbox Code Playgroud)

给出了这个数据框:

        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
Run Code Online (Sandbox Code Playgroud)


jpp*_*jpp 6

何时使用dt存取器

一个常见的混淆来源围绕着何时使用.year和何时使用.dt.year

前者是pd.DatetimeIndex对象的属性;后者用于pd.Series对象。考虑这个数据框:

df = pd.DataFrame({'Dates': pd.to_datetime(['2018-01-01', '2018-10-20', '2018-12-25'])},
                  index=pd.to_datetime(['2000-01-01', '2000-01-02', '2000-01-03']))
Run Code Online (Sandbox Code Playgroud)

系列和索引的定义看起来很相似,但pd.DataFrame构造函数将它们转换为不同的类型:

type(df.index)     # pandas.tseries.index.DatetimeIndex
type(df['Dates'])  # pandas.core.series.Series
Run Code Online (Sandbox Code Playgroud)

DatetimeIndex对象有一个直接的year属性,而Series对象必须使用的dt访问。同样对于month

df.index.month               # array([1, 1, 1])
df['Dates'].dt.month.values  # array([ 1, 10, 12], dtype=int64)
Run Code Online (Sandbox Code Playgroud)

值得注意的一个微妙但重要的区别是,它df.index.month给出了一个 NumPy 数组,而df['Dates'].dt.month给出了一个 Pandas 系列。上面,我们pd.Series.values用来提取 NumPy 数组表示。


Ami*_*pta 5

可能已经太晚了,无法回答,但由于您在加载数据时已经解析了日期,因此您可以这样做来获取日期

df['date'] = pd.DatetimeIndex(df['date']).year
Run Code Online (Sandbox Code Playgroud)