#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)