pandas 从日期时间中提取年份: df['year'] = df['date'].year 不起作用
- 2025-03-14 08:57:00
- admin 原创
- 61
问题描述:
我通过导入数据框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
更新:当我尝试使用df['date'].dt
我的 pandas 版本 0.14.1 来解决时,出现“AttributeError:'Series' 对象没有属性'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
有什么想法吗?
解决方案 1:
如果您正在运行较新版本的 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]
,请参阅文档
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
“日期”列。
解决方案 2:
这有效:
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
解决方案 3:
何时使用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']))
系列和索引的定义看起来类似,但是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 数组表示。
解决方案 4:
可能已经太晚了,但是由于您在加载数据时已经解析了日期,因此您只需执行此操作即可获取日期
df['date'] = pd.DatetimeIndex(df['date']).year
解决方案 5:
对我有用的是将熊猫升级到最新版本:
从命令行执行:
conda update pandas
扫码咨询,免费领取项目管理大礼包!