Панды: как взять годовой месяц столбца даты? - PullRequest
0 голосов
/ 13 сентября 2018

У меня есть большой фрейм данных df, который содержит дату в форме %Y-%m-%d.

df
    val     date
0   356   2017-01-03
1   27    2017-03-28
2   33    2017-07-12
3   455   2017-09-14

Я хочу создать новый столбец YearMonth, который содержит дату в форме %Y%m

df['YearMonth'] = df['date'].dt.to_period('M')

, но это занимает очень много времени

Ответы [ 2 ]

0 голосов
/ 13 сентября 2018

Вы можете преобразовать столбец date в строку, если его еще нет, а затем обрезать до года и месяца (т. Е. До первых семи символов).

df['YearMonth'] = df['date'].astype(str).str[:7]
   val        date YearMonth
0  356  2017-01-03   2017-01
1   27  2017-03-28   2017-03
2   33  2017-07-12   2017-07
3  455  2017-09-14   2017-09
0 голосов
/ 13 сентября 2018

Ваше решение быстрее, чем strftime в большем DataFrame, но есть другой вывод - Period s против strings:

df['YearMonth'] = df['date'].dt.strftime('%Y-%m')
df['YearMonth1'] = df['date'].dt.to_period('M')
print (type(df.loc[0, 'YearMonth']))
<class 'str'>

print (type(df.loc[0, 'YearMonth1']))
<class 'pandas._libs.tslibs.period.Period'>

#[40000 rows x 2 columns]
df = pd.concat([df] * 10000, ignore_index=True)

In [63]: %timeit df['date'].dt.strftime('%Y-%m')
237 ms ± 1.7 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

In [64]: %timeit df['date'].dt.to_period('M')
57 ms ± 985 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

Понимание спискаслишком медленно:

In [65]: %timeit df['new'] = [str(x)[:7] for x in df['date']]
209 ms ± 2.6 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

Другое решение Александра:

In [66]: %timeit df['date'].astype(str).str[:7]
236 ms ± 1.4 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...