2015-09-22 3 views
0

У меня есть набор данных, который имеет столбец даты:Extract лет из столбца даты строки в колонке панд

df.faultDate.head() 

0 2014-07-13 
1 2014-07-13 
2 2014-07-12 
3 2014-07-12 
4 2014-07-13 

Я пытаюсь получить только лет от этого.

dt.datetime.strptime(df.faultDate[0], '%Y-%m-%d').year 

2014 

Но:

df.faultDate.apply(dt.datetime.strptime, args=('%Y-%m-%d')) 

--------------------------------------------------------------------------- 
TypeError         Traceback (most recent call last) 
<ipython-input-21-bca0dc79125b> in <module>() 
----> 1 df.faultDate.apply(dt.datetime.strptime, args=('%Y-%m-%d')) 

/home/shiny/anaconda3/lib/python3.4/site-packages/pandas/core/series.py in apply(self, func, convert_dtype, args, **kwds) 
    2058    values = lib.map_infer(values, lib.Timestamp) 
    2059 
-> 2060   mapped = lib.map_infer(values, f, convert=convert_dtype) 
    2061   if len(mapped) and isinstance(mapped[0], Series): 
    2062    from pandas.core.frame import DataFrame 

pandas/src/inference.pyx in pandas.lib.map_infer (pandas/lib.c:58435)() 

/home/shiny/anaconda3/lib/python3.4/site-packages/pandas/core/series.py in <lambda>(x) 
    2047 
    2048   if kwds or args and not isinstance(func, np.ufunc): 
-> 2049    f = lambda x: func(x, *args, **kwds) 
    2050   else: 
    2051    f = func 

TypeError: strptime() takes exactly 2 arguments (9 given) 

Я также не знаю, как передать .year аргумент после того как я успешно преобразовать строки в DateTimes. Я мог бы написать функцию-обертку, которая принимает каждую строку в качестве входных данных, а затем извлекает год, но я думаю, что полезно знать, как применять синтаксис pandas для использования в будущем. Благодаря!

ответ

3

Метод № 1 (лучше, ИМХО): рассматривайте его как проблему синтаксического анализа даты, после чего мы можем использовать векторизованный временной доступ для времени .dt10.

>>> pd.to_datetime(df.faultDate).dt.year 
0 2014 
1 2014 
2 2014 
3 2014 
4 2014 
dtype: int64 

, где мы можем указать формат, если мы хотим:

>>> pd.to_datetime(df.faultDate, format="%Y-%m-%d").dt.year 
0 2014 
1 2014 
2 2014 
3 2014 
4 2014 
dtype: int64 

Метод # 2: рассматривать его как синтаксический анализ проблемы строки. Менее естественным в некотором роде, но как пример трюков, которые могут пригодиться в других случаях, неплохо. Мы можем использовать векторизованные струнные операции:

>>> df.faultDate.str[:4].astype(int) 
0 2014 
1 2014 
2 2014 
3 2014 
4 2014 
Name: faultDate, dtype: int64 
>>> df.faultDate.str.split("-").str[0].astype(int) 
0 2014 
1 2014 
2 2014 
3 2014 
4 2014 
dtype: int64 
+0

Спасибо! Мне нравится первая версия. –

0

Я думаю, что вам нужно, это позвонить по отношению к реальному объекту, а не весь файл:

dt.datetime.strptime(df.faultDate[0], '%Y-%m-%d').year 

Превращается

(df.faultDate[0]).apply(dt.datetime.strptime, args=('%Y-%m-%d’)) 

Обратите внимание, что индекс!