L oop через дату и присвоить значение как номер недели - PullRequest
0 голосов
/ 06 августа 2020

У меня есть Dataframe со столбцом даты. Я хотел бы создать новый столбец и назначить значение для каждых 7 дней как неделя 1, неделя 2 ... Я узнал, что df.iloc[::7, :] будет выполнять l oop, но как присвоить значения новому столбцу. Спасибо.

Date        Week
1/1/2020    1
2/1/2020    1
3/1/2020    1
...
8/1/2020    2
9/1/2020    2

Ответы [ 5 ]

2 голосов
/ 06 августа 2020

Есть встроенная функция преобразования даты в неделю года: pd.DatetimeIndex.weekofyear. Например:

import pandas as pd

n = 5
df = pd.DataFrame({'data': [*range(n)]},
             index = pd.date_range(start = '2020-01-01', periods = n, freq='4D')
            )
df['week-number'] = df.index.weekofyear
print(df)

            data  week-number
2020-01-01     0            1
2020-01-05     1            1
2020-01-09     2            2
2020-01-13     3            3
2020-01-17     4            3

weekofyear устарело в pandas версии 1.1.0. Подробнее здесь: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DatetimeIndex.weekofyear.html

2 голосов
/ 06 августа 2020

Для общего решения вычтите минимальную дату, преобразуйте timedeltas в дни и используйте целочисленное деление на 7 с добавлением 1:

df['Date'] = pd.to_datetime(df['Date'], format='%d/%m/%Y')

df['Week'] = df['Date'].sub(df['Date'].min()).dt.days // 7 + 1
print (df)
         Date  Week
0 2020-01-01     1
1 2020-01-02     1
2 2020-01-03     1
3 2020-01-08     2
4 2020-01-09     2

Если есть последовательные даты без дубликатов, разделите вспомогательный массив на длину строк с помощью 7 и добавьте 1 (но это не удалось, если пропущена только 1 дата):

df['Week'] = np.arange(len(df)) // 7 + 1
0 голосов
/ 06 августа 2020

Один лайнер, потому что:

df = df[['Date']]
df['Week_no'] = [pd.Period(df['Date'].iloc[k]).week for k in df.index]
0 голосов
/ 06 августа 2020

Если столбец Date имеет тип datetime.date, тогда isocalendar() вернет кортеж из 3-х элементов, содержащий год, номер недели и день недели по ISO:

In [10]: d = datetime.date(2020,1,1)

In [11]: d.isocalendar()
Out[11]: (2020, 1, 3)

In [12]: d = datetime.date(2020,1,8)

In [13]: d.isocalendar()
Out[13]: (2020, 2, 3)
0 голосов
/ 06 августа 2020

Вычесть начальную дату (строка 1) из текущей даты. Преобразовать в дни (целое число). разделите // на 7 и прибавьте 1; это номер вашей недели.

Можете ли вы взять код оттуда?

week_num = int(current_date - Date[0]) // 7 + 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...