Объединение столбцов в объекте Isoweek - PullRequest
1 голос
/ 12 октября 2019

У меня есть кадр данных pandas, который содержит столбец года и недели:

year     week
2018     18
2019     17
2019     17

Я пытаюсь объединить столбцы года и недели в новый столбец 'isoweek', используя isoweek библиотека. Я не могу понять, как правильно перебрать строки для создания столбца объекта. Если я сделаю что-то вроде:

df['isoweek'] = Week(df['year'],df['week'])

isoweek дросселирует на векторизацию. Я попытался создать базовый список и добавить его к моему фрейму данных, например, так:

 obj_list = []

 for i in range(500):
     year = df['year'][i]
     week = df['week'][i]
     w = Week(year,week)
     obj_list.append(w)

 df['isoweek'] = obj_list

Но я получаю простой кортеж в столбце.

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

 df['isoweek'] - 4 
 >isoweek.Week(2019, 34)

Возможно ли даже сохранить подобный объект в столбце данных? Если да, то как это сделать?

Ответы [ 2 ]

1 голос
/ 13 октября 2019

В качестве альтернативы вы можете использовать встроенный метод для datetime:

df['week_start'] = pd.to_datetime(df['year'].astype(str), format='%Y') + pd.to_timedelta(df['week'].mul(7).astype(str) + ' days')

# Output:
    week    year    week_start
0   18  2018    2018-05-07
1   17  2019    2019-04-30
2   17  2019    2019-04-30

Расчет разницы во времени здесь довольно прост:

# Choose 7 weeks
n_weeks = pd.to_timedelta(7, unit='W')

# Adding is simple
df['week_start'] + n_weeks

# Output
0   2018-06-25
1   2019-06-18
2   2019-06-18

Подробнее об этом, прочитайте: Панды: Как создать объект даты-времени из Недели и Года?

0 голосов
/ 13 октября 2019

Потенциально вы можете сделать это

Сначала настройте примерный фрейм данных

from isoweek import Week
df = pd.DataFrame ({'year' : [2018,2019,2019], 
                    'week' : [18,17,17]})

Циклически перебирайте фрейм данных, добавляя isoweek в список

ls_isoweek = []
for row in df.itertuples(): 
    ls_isoweek.append(Week(row[1],row[2]))

Список выглядит следующим образом

[isoweek.Week(2018, 18), isoweek.Week(2019, 17), isoweek.Week(2019, 17)]

К этому списку можно получить доступ таким образом

ls_isoweek[0] - 4

Создает этот вывод

isoweek.Week(2018, 14)

Однако список также можно добавить обратнок кадру данных, если вы хотите

df['isoweek'] = ls_isoweek

Затем вы можете делать такие вещи, как ...

df['isoweek_minus_4'] = df['isoweek'].apply(lambda x: x-4)

Создание вывода, как показано ниже

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...