web-dev-qa-db-ja.com

python pandas datetimeから年を抽出--- df ['year'] = df ['date']。yearは機能していません

繰り返しのように見えるこの質問で申し訳ありません-答えは私が骨頭のように感じることを期待しています...しかし、私は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

しかし、これは戻ります:

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

これにより、同じ「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

何か案は?

48
MJS

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でこれをdatetimeに解析しなかった理由については、Trueが列を解析しようとすると[0]を参照して、列の序数位置([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

したがって、param parse_dates=[0]read_csvに渡す場合、ロード後に 'date'列でto_datetimeを呼び出す必要はありません。

82
EdChum

これは動作します:

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
9
Mike Müller

私のために働いたのはpandasを最新バージョンにアップグレードすることでした:

コマンドラインから:

conda update pandas
2
Jimmy

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配列表現を抽出します。

1
jpp