web-dev-qa-db-ja.com

指定された日付から日、月、年を抽出する最も速い方法はどれですか?

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

ありがとうございました。

15
ram

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
31
Jeff

私は私にとって非常にうまく機能する以下のコードを使用しています

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)
0
Nim J