1. ホーム
  2. python

python pandas extract year from datetime: df['year'] = df['date'].year is not working

2023-10-31 12:26:23

質問

データフレームを 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

UPDATE で解決しようとすると 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 64bitを使用しています。

conda update pandas

conda install pandas==0.15.2

conda install -f pandas

何かアイデアはありますか?

どのように解決するのですか?

最近のバージョンの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

EDIT

古いバージョンの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

でこれをdatetimeにパースしなかった理由については 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 を呼び出す必要はないはずです。