150,000行を含むcsvファイルをpandasデータフレームに読み込みます。このデータフレームには、「Date」フィールドがあり、日付はyyyy-mm-dd形式です。それから月、日、年を抽出して、それぞれデータフレームの列、「Month」、「Day」、「Year」にコピーしたいと思います。数百のレコードの場合、以下の2つの方法で問題ありませんが、150,000のレコードでは両方とも実行に途方もなく長い時間がかかります。100,000以上のレコードに対してこれを行うより速い方法はありますか?
最初の方法:
df = pandas.read_csv(filename)
for i in xrange(len(df)):
df.loc[i,'Day'] = int(df.loc[i,'Date'].split('-')[2])
2番目の方法:
df = pandas.read_csv(filename)
for i in xrange(len(df)):
df.loc[i,'Day'] = datetime.strptime(df.loc[i,'Date'], '%Y-%m-%d').day
ありがとうございました。
0.15.0では、新しい.dtアクセサーを使用して、これを構文的に実行できます。
In [36]: df = DataFrame(date_range('20000101',periods=150000,freq='H'),columns=['Date'])
In [37]: df.head(5)
Out[37]:
Date
0 2000-01-01 00:00:00
1 2000-01-01 01:00:00
2 2000-01-01 02:00:00
3 2000-01-01 03:00:00
4 2000-01-01 04:00:00
[5 rows x 1 columns]
In [38]: %timeit f(df)
10 loops, best of 3: 22 ms per loop
In [39]: def f(df):
df = df.copy()
df['Year'] = DatetimeIndex(df['Date']).year
df['Month'] = DatetimeIndex(df['Date']).month
df['Day'] = DatetimeIndex(df['Date']).day
return df
....:
In [40]: f(df).head()
Out[40]:
Date Year Month Day
0 2000-01-01 00:00:00 2000 1 1
1 2000-01-01 01:00:00 2000 1 1
2 2000-01-01 02:00:00 2000 1 1
3 2000-01-01 03:00:00 2000 1 1
4 2000-01-01 04:00:00 2000 1 1
[5 rows x 4 columns]
0.15.0以降(2014年9月末にリリース)から、新しい.dtアクセサーで次のことが可能になりました。
df['Year'] = df['Date'].dt.year
df['Month'] = df['Date'].dt.month
df['Day'] = df['Date'].dt.day
私は私にとって非常にうまく機能する以下のコードを使用しています
df['Year']=[d.split('-')[0] for d in df.Date]
df['Month']=[d.split('-')[1] for d in df.Date]
df['Day']=[d.split('-')[2] for d in df.Date]
df.head(5)