Какой самый быстрый способ извлечь день, месяц и год с определенной даты?

Я прочитал файл csv, содержащий 150 000 строк, в фреймворк pandas. Этот dataframe имеет поле "Дата" с датами в формате yyyy-mm-dd. Я хочу извлечь из него месяц, день и год и скопировать в столбцы dataframes, "Месяц", "День" и "Год" соответственно. Для нескольких сотен записей два нижеуказанных метода работают нормально, но для 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])

Второй метод:

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

Спасибо.

Ответ 1

В 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 года) теперь возможно использование нового .dt-аксессуара:

df['Year'] = df['Date'].dt.year
df['Month'] = df['Date'].dt.month
df['Day'] = df['Date'].dt.day

Ответ 2

Я использую ниже код, который очень хорошо работает для меня

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)