python pandas 从日期时间中提取年份:df['year'] = df['date'].year 不起作用
python pandas extract year from datetime: df['year'] = df['date'].year is not working
我通过 read_csv
导入数据框,但由于某种原因无法从系列 df['date']
中提取年份或月份,尝试给出 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
更新:
当我在我的 pandas 版本 0.14.1 上尝试使用 df['date'].dt
的解决方案时,我得到“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
对于这个看似重复的问题,我深表歉意 - 我希望这个答案会让我觉得自己像个笨蛋......但我没有运气使用 SO 上类似问题的答案。
跟进:我似乎无法在我的 Anaconda 环境中将我的 pandas 0.14.1 更新到更新的版本,下面的每一次尝试都会产生一个无效的语法错误。我正在使用 Python 3.4.1 64 位。
conda update pandas
conda install pandas==0.15.2
conda install -f pandas
有什么想法吗?
这个有效:
df['date'].dt.year
现在:
df['year'] = df['date'].dt.year
df['month'] = df['date'].dt.month
给出这个数据框:
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
如果您 运行 是 pandas 的最新版本,那么您可以使用日期时间属性 dt
访问日期时间组件:
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
编辑
看起来您 运行 是 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
关于为什么它没有将其解析为 read_csv
中的日期时间,您需要传递列 ([0]
) 的序号位置,因为当 True
时它会尝试解析列 [1,2,3]
参见 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
,那么加载后就不需要在 'date' 列上调用 to_datetime
。
对我有用的是将 pandas 升级到最新版本:
从命令行执行:
conda update pandas
何时使用 dt
访问器
一个常见的混淆来源围绕何时使用 .year
以及何时使用 .dt.year
。
前者是pd.DatetimeIndex
objects; the latter for 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']))
系列和索引的定义看起来很相似,但是 pd.DataFrame
构造函数将它们转换为不同的类型:
type(df.index) # pandas.tseries.index.DatetimeIndex
type(df['Dates']) # pandas.core.series.Series
DatetimeIndex
对象有一个直接的 year
属性,而 Series
对象必须使用 dt
访问器。 month
类似:
df.index.month # array([1, 1, 1])
df['Dates'].dt.month.values # array([ 1, 10, 12], dtype=int64)
值得注意的一个微妙但重要的区别是 df.index.month
给出了一个 NumPy 数组,而 df['Dates'].dt.month
给出了一个 Pandas 系列。上面,我们使用 pd.Series.values
来提取 NumPy 数组表示。
可能已经来不及回答了,但是由于您已经在加载数据时解析了日期,所以您可以这样做来获取日期
df['date'] = pd.DatetimeIndex(df['date']).year
我通过 read_csv
导入数据框,但由于某种原因无法从系列 df['date']
中提取年份或月份,尝试给出 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
更新:
当我在我的 pandas 版本 0.14.1 上尝试使用 df['date'].dt
的解决方案时,我得到“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
对于这个看似重复的问题,我深表歉意 - 我希望这个答案会让我觉得自己像个笨蛋......但我没有运气使用 SO 上类似问题的答案。
跟进:我似乎无法在我的 Anaconda 环境中将我的 pandas 0.14.1 更新到更新的版本,下面的每一次尝试都会产生一个无效的语法错误。我正在使用 Python 3.4.1 64 位。
conda update pandas
conda install pandas==0.15.2
conda install -f pandas
有什么想法吗?
这个有效:
df['date'].dt.year
现在:
df['year'] = df['date'].dt.year
df['month'] = df['date'].dt.month
给出这个数据框:
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
如果您 运行 是 pandas 的最新版本,那么您可以使用日期时间属性 dt
访问日期时间组件:
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
编辑
看起来您 运行 是 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
关于为什么它没有将其解析为 read_csv
中的日期时间,您需要传递列 ([0]
) 的序号位置,因为当 True
时它会尝试解析列 [1,2,3]
参见 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
,那么加载后就不需要在 'date' 列上调用 to_datetime
。
对我有用的是将 pandas 升级到最新版本:
从命令行执行:
conda update pandas
何时使用 dt
访问器
一个常见的混淆来源围绕何时使用 .year
以及何时使用 .dt.year
。
前者是pd.DatetimeIndex
objects; the latter for 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']))
系列和索引的定义看起来很相似,但是 pd.DataFrame
构造函数将它们转换为不同的类型:
type(df.index) # pandas.tseries.index.DatetimeIndex
type(df['Dates']) # pandas.core.series.Series
DatetimeIndex
对象有一个直接的 year
属性,而 Series
对象必须使用 dt
访问器。 month
类似:
df.index.month # array([1, 1, 1])
df['Dates'].dt.month.values # array([ 1, 10, 12], dtype=int64)
值得注意的一个微妙但重要的区别是 df.index.month
给出了一个 NumPy 数组,而 df['Dates'].dt.month
给出了一个 Pandas 系列。上面,我们使用 pd.Series.values
来提取 NumPy 数组表示。
可能已经来不及回答了,但是由于您已经在加载数据时解析了日期,所以您可以这样做来获取日期
df['date'] = pd.DatetimeIndex(df['date']).year