Создание номера недели и года компании в пандах - PullRequest
0 голосов
/ 22 октября 2018

предположим, что в моей текущей компании есть df

import pandas as pd

data = {'Dates' : ['2018-10-15', '2018-02-01', '2018-04-01']}
data['Dates'] = pd.to_datetime(data.Dates)

print(df)
    Dates
0   2018-10-15
1   2018-02-01
2   2018-04-01

, у нас есть структура финансовой недели, которую я обычно вырабатываю с помощью Excel, и я хотел бы сделать это в Python

Я использую модуль DateTime для обхода следующих условий:

если месяц равен >= 4 (апрель), то номер недели равен 1 (поэтому я беру номер недели по ISO и вычитаю 13)

если месяц равен < 4 Я добавляю 39.

Я использую ту же логику для ГОДА, если> = 4, то год + 1, еще ГОД

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

for x in data.Dates:
    if x.dt.month >= 4:
       df['Week'] = x.dt.week - 13
    else:
        df['Week'] = x.dt.week + 39

и для года

for x in data.Dates:
    if x.dt.month >= 4:
       df['Year'] = FY & x.dt.year + 1
    else:
         df['Year'] = FY & x.dt.year

, однако, >= 4 в обоих случаях выдает ошибку формулы.

File "<ipython-input-38-eadb99fdd9db>", line 4 df.Dates.dt.month > 4: ^ SyntaxError: invalid syntax

однако, если я сделаю

data['Week'] = data.Dates.dt.week

, это даст все номера недели, я пропустил что-то основное или существенное здесь?

Я надеюсь, что это ясно и кратко, любой совет (даже как задавать лучшие вопросы) приветствуется.

Ответы [ 5 ]

0 голосов
/ 22 октября 2018

Не используйте явный цикл

Pandas специализируется на векторизованных операциях.Там нет необходимости для for петли.Вы можете использовать, например, numpy.where для условного создания ряда:

import numpy as np

data['Week'] = np.where(data['Dates'].dt.month >= 4, data['Dates'].dt.week - 13,
                        data['Dates'].dt.week + 39)

Причина, по которой ваш код не работает, заключается в том, что вы обновляете всю серию в каждом циклеа не элементы в серии.Другими словами, вы применяете поэлементную логику к серии.

0 голосов
/ 22 октября 2018

однако, если я сделаю data ['Week'] = data.Dates.dt.week, это даст все номера недели, я пропускаю что-то базовое или важное здесь?

Попробуйте это

def my_f(x):
    if x.month >= 4:
        return x.week - 13
    else:
        return x.week + 39


df['Week'] = df.Dates.apply(lambda x: my_f(x))
0 голосов
/ 22 октября 2018

Вы почти у цели, просто бросьте дт, например, так:

for x in data.Dates:
    if x.month >= 4:
       df['Year'] = FY & x.year + 1
    else:
       df['Year'] = FY & x.year
0 голосов
/ 22 октября 2018

Проблема возникает из-за того, что вы перебираете значения в df['Dates'], которые являются TimeStamp объектами.Это эквивалентно проходу через df['Dates'][0], df['Dates'][1] ... для извлечения интересующей функции.Чтобы извлечь конкретную «функцию, связанную с датой», например, месяц, день или неделю, вы можете просто извлечь атрибут следующим образом:

df['Dates'][0].month

С другой стороны, df['Dates']сам по себе является отметкой времени панды Series объект.Чтобы извлечь эти функции, связанные с датами, из всего Series, вам нужно использовать что-то вроде:

df['Dates'].dt.month

Это похоже на функционирование "строки" Series объект, для которого необходимо вызвать pd.Series.str.<method>, чтобы выполнить необходимую строковую операцию (например, extract, contains, get и т. д.) для всего объекта Series.

0 голосов
/ 22 октября 2018

Синтаксическая ошибка не приходит отсюда, но попробуйте удалить 'dt' в ваших циклах for:

import pandas as pd

df = pd.DataFrame()
df['Dates'] = pd.to_datetime({'Dates' : ['2018-10-15', '2018-02-01', '2018-04-01']})

for x in df.Dates:
    if x.month >= 4:
        df['Week'] = x.week - 13
    else:
        df['Week'] = x.week + 39


for x in df.Dates:
    if x.month >= 4:
        df['Year'] = FY & x.year + 1
    else:
        df['Year'] = FY & x.year

Вопрос немного сбивает с толку из-за использования 'data' и 'df».Надеюсь, я не ошибся в интерпретации.

Если это не работает, вы можете опубликовать весь код, чтобы я мог попробовать?

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