Получение новых данных из столбца Pandas datetime

#python #datetime #pandas

#python #datetime #pandas

Вопрос:

У меня есть столбец временных меток (в мс) pandas во фрейме данных. Из временных меток я пытаюсь вывести час, минуту, день недели и месяц временной метки в отдельных столбцах.

Я пытался использовать apply функцию по всему столбцу, но безрезультатно. Итак, я выбрал очень наивный (но не очень лаконичный) подход к созданию этих столбцов:

 import pandas
import datetime

df=pd.DataFrame( {'time':[1401811621559, 1402673694105, 1402673749561, 1401811615479, 1402673708254], 'person':['Harry', 'Ann', 'Sue', 'Jeremy', 'Anne']})

df['time'] = pandas.to_datetime(df.time, unit='ms')
days = []
tod = []
month = []
minutes = []
for row in df['time']:
    days.append(row.strftime('%w'))
    tod.append(row.strftime('%H'))
    month.append(row.strftime('%m'))
    minutes.append(row.strftime('%M'))
##
df['dayOfWeek'] = days
df['timeOfDay'] = tod
df['month'] = month
df['minutes'] = minutes
  

Есть ли способ сделать это, который больше похож на этот?

 df['dayOfWeek'] = df['time'].apply(strftime('%w'),axis = 1)

    Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
    NameError: name 'strftime' is not defined
  

Ответ №1:

На данный момент вам нужно обернуть столбец в DatetimeIndex:

 In [11]: dti = pd.DatetimeIndex(df['time'])

In [12]: dti.dayofweek
Out[12]: array([1, 4, 4, 1, 4])

In [13]: dti.time
Out[13]:
array([datetime.time(16, 7, 1, 559000), datetime.time(15, 34, 54, 105000),
       datetime.time(15, 35, 49, 561000), datetime.time(16, 6, 55, 479000),
       datetime.time(15, 35, 8, 254000)], dtype=object)

In [14]: dti.month
Out[14]: array([6, 6, 6, 6, 6])

In [15]: dti.minute
Out[15]: array([ 7, 34, 35,  6, 35])
  

и т.д.

Смотрите Этот выпуск, чтобы сделать эти методы доступными напрямую из серии datetime.

Ответ №2:

Вы также можете сделать это лямбда-функцией:

 df['dayOfWeek2'] = df.time.apply(lambda x:x.strftime('%w'))
  

Теперь вводим

 df.dayOfWeek2 == df.dayOfWeek
  

дает

 0    True
1    True
2    True
3    True
4    True
dtype: bool
  

Комментарии:

1. Спасибо! Работает хорошо.

Ответ №3:

Да, есть, немного изменив ваш код…

 def timeGroups(row):
    row['days'] = row['time'].strftime('%w'))
    #do the same thing for month,seconds,etc.
    return row
df['dayOfWeek'] = df['time'].apply(timeGroups,axis = 1)