python pandas 从日期时间中提取年份:df['year'] = df['date'].year 不起作用

Posted

技术标签:

【中文标题】python pandas 从日期时间中提取年份:df[\'year\'] = df[\'date\'].year 不起作用【英文标题】:python pandas extract year from datetime: df['year'] = df['date'].year is not workingpython pandas 从日期时间中提取年份:df['year'] = df['date'].year 不起作用 【发布时间】:2015-08-04 23:46:54 【问题描述】:

我通过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

更新: 当我在我的熊猫版本 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"][0].year 我有一个包含日期和其他列的 csv 文件,这些列都来自 SQL 作为字符串数据。尝试创建新的年份和月份列以用于分组。 csv 有 ~5000 行。 是的,但是 df["date"] 是一个 'pandas.core.series.Series' 对象。 df['date'].year 应该是什么? 我只想再创建 2 列...一列表示年份,一列表示月份为整数。 也试过 df['date'].dt.year,EdChum。 【参考方案1】:

这行得通:

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

【讨论】:

【参考方案2】:

如果您运行的是最新版本的 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

编辑

看起来您正在运行旧版本的 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] 时,请参阅 @987654322 @

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

【讨论】:

【参考方案3】:

对我有用的是将熊猫升级到最新版本:

从命令行执行:

conda update pandas

【讨论】:

【参考方案4】:

何时使用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 数组表示。

【讨论】:

【参考方案5】:

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

df['date'] = pd.DatetimeIndex(df['date']).year

【讨论】:

以上是关于python pandas 从日期时间中提取年份:df['year'] = df['date'].year 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

如何从包含文本的熊猫数据框中的列中提取年份(或日期时间)

如何从python中不同类型的日期中提取年份

python - 如何将带有年份的周数转换为python pandas中的日期时间格式?

如何从日期字符串中提取年份?

使用python从未知日期格式中获取年份

如何从 MDX 查询中提取日期中的月份年份