繰り返しのように見えるこの質問で申し訳ありません-答えは私が骨頭のように感じることを期待しています...しかし、私は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
何か案は?
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
を呼び出す必要はありません。
これは動作します:
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を最新バージョンにアップグレードすることでした:
コマンドラインから:
conda update pandas
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配列表現を抽出します。