Как я могу сделать новый столбец «Неделя» в фрейме данных в pandas?

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

my_dict = {
    "Date": pd.date_range('2020', freq='D', periods=100),
    "Open": np.random.randn(100),
    "High": np.random.randn(100),
    "Low": np.random.randn(100),
    "Close": np.random.randn(100),
    "Volume": np.random.randn(100),
}

df = pd.DataFrame(my_dict)
display(df)

Как добавить столбец «Неделя» и такие значения, как «2020-01», «2020-02»?

«2020-01» означает первую неделю 2020 года.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
260
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Получите год, используя атрибут dt year, и соедините его с атрибутом week. zfill — заполнить начальные нули.

(df['Date'].dt.year.astype(str)
     .str.cat(df['Date'].dt.week.astype(str).str.zfill(2),
              sep='-'))

    0     2020-01
    1     2020-01
    2     2020-01
    3     2020-01
    4     2020-01
           ...   
    95    2020-14
    96    2020-15
    97    2020-15
    98    2020-15
    99    2020-15

Здравствуйте, могу ли я использовать вашу функцию для случайных дат?

Ahmed Mamdouh 24.12.2020 15:06

В опубликованном вами примере столбец даты представляет собой объект даты и времени. Таким образом, вы можете напрямую использовать dt и получить необходимые данные. Если это не объект даты и времени, вам необходимо преобразовать объект даты и времени. Кроме того, если день месяца не указан в столбце даты, вы не можете получить неделю

ggaurav 24.12.2020 15:09

Сделай это:

In [2233]: df['Week'] = df.Date.dt.year.astype(str) + '-' + df.Date.dt.week.astype(str).map(lambda x: f'{x:0>2}')

In [2234]: df.Week
Out[2234]: 
0     2020-01
1     2020-01
2     2020-01
3     2020-01
4     2020-01
       ...   
95    2020-14
96    2020-15
97    2020-15
98    2020-15
99    2020-15
Name: Week, Length: 100, dtype: object

Здравствуйте, могу ли я использовать вашу функцию для случайных дат?

Ahmed Mamdouh 24.12.2020 15:06

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

Mayank Porwal 24.12.2020 15:07

Вы также можете сделать следующее:

df["Week"] = 1
df["Week"] = pd.to_datetime(df['Date']).dt.to_period('M')

dt.to_period принимает значение M/Y/D для печати месяца, года и даты соответственно.

Я не думаю, что это ожидаемый результат. ОП хочет точный номер недели в году, а не комбинацию year-month.

Mayank Porwal 24.12.2020 15:31

используйте datetime. Я использую pandas .apply() и функцию lambda для форматирования недели.

Поскольку столбцы «Дата» состоят из объектов класса временных меток, функция isocalendar() возвращает кортеж ('year','week','day'), который отформатирован так, как вы хотите.

import datetime
df['Week']=df['Date'].apply(lambda x: "{0}-{1:02d}".format(*list(x.isocalendar())))
df.head(10)

выход:

Date    Open    High    Low Close   Volume  Week
0   2020-01-01  -0.628361   -0.019378   0.167120    1.421006    -0.698276   2020-01
1   2020-01-02  -0.515597   0.467128    1.784242    0.358433    0.197478    2020-01
2   2020-01-03  0.781038    0.225310    -0.636053   -0.241801   0.777247    2020-01
3   2020-01-04  1.332335    0.687737    -0.531952   1.554296    -0.243784   2020-01
4   2020-01-05  0.457940    -1.488220   0.408476    -0.196996   -0.970725   2020-01
5   2020-01-06  1.660737    0.610343    -0.769449   -0.854537   -1.203444   2020-02
6   2020-01-07  -0.472873   0.276941    -0.266524   0.450023    1.260696    2020-02
7   2020-01-08  -0.851558   0.092650    0.207837    0.107786    -0.002486   2020-02
8   2020-01-09  0.967156    0.337234    -1.394543   -0.221563   1.231157    2020-02
9   2020-01-10  0.407043    -1.079271   -0.730196   -0.262280   0.367848    2020-02

Другие вопросы по теме