создание новой переменной и применение условного значения на основе диапазона дат с панелью данных pandas - PullRequest
1 голос
/ 03 ноября 2019

Новый для Python и кодирования в целом здесь, так что это должно быть довольно простым для большинства из вас.

Я в основном создал этот фрейм данных с индексом Datetime.

Вот кадр данных

df = pd.date_range(start='2018-01-01', end='2019-12-31', freq='D')

Теперь я хотел бы добавить новую переменную для моего df под названием «отпуск» со значением 1, если дата находится между 2018-06-24 и2018-08-24 и значение 0, если это не между этими датами. Как я могу сделать это? Я создал переменную с диапазоном отпуска, но я не уверен, как соединить эти два значения вместе с созданием нового столбца для «отпуска» в моем фрейме данных.

vacation = pd.date_range(start = '2018-06-24', end='2018-08-24')

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 03 ноября 2019

Решение для нового DataFrame:

i = pd.date_range(start='2018-01-01', end='2018-08-26', freq='D')

m = (i > '2018-06-24') & (i < '2018-08-24') 
df = pd.DataFrame({'vacation': m.astype(int)}, index=i)

Или:

df = pd.DataFrame({'vacation':np.where(m, 1, 0)}, index=i)

print (df)
            vacation
2018-01-01         0
2018-01-02         0
2018-01-03         0
2018-01-04         0
2018-01-05         0
             ...
2018-08-22         1
2018-08-23         1
2018-08-24         0
2018-08-25         0
2018-08-26         0

[238 rows x 1 columns]

Решение для добавления нового столбца в существующий DataFrame:

Создать маску путем сравнения DatetimeIndex с цепочкой по & для bitwise AND и преобразовать ее в целое число (True в 1 и False в 0) или использовать numpy.where:

i = pd.date_range(start='2018-01-01', end='2018-08-26', freq='D')
df = pd.DataFrame({'a': 1}, index=i)

m = (df.index > '2018-06-24') & (df.index < '2018-08-24') 

df['vacation'] = m.astype(int)
#alternative
#df['vacation'] = np.where(m, 1, 0)
print (df)
            a  vacation
2018-01-01  1         0
2018-01-02  1         0
2018-01-03  1         0
2018-01-04  1         0
2018-01-05  1         0
       ..       ...
2018-08-22  1         1
2018-08-23  1         1
2018-08-24  1         0
2018-08-25  1         0
2018-08-26  1         0

[238 rows x 2 columns]

Другое решение с DatetimeIndex и DataFrame.loc - разница составляет 1, включая 2018-06-24 и 2018-08-24 значения ребра:

df['vacation'] = 0
df.loc['2018-06-24':'2018-08-24'] = 1
print (df)
           a  vacation
2018-01-01  1         0
2018-01-02  1         0
2018-01-03  1         0
2018-01-04  1         0
2018-01-05  1         0
       ..       ...
2018-08-22  1         1
2018-08-23  1         1
2018-08-24  1         1
2018-08-25  1         0
2018-08-26  1         0

[238 rows x 2 columns]
0 голосов
/ 03 ноября 2019

Во-первых, pd.date_range(start='2018-01-01', end='2019-12-31', freq='D') не создаст DataFrame, вместо этого он создаст DatetimeIndex. Затем его можно преобразовать в DataFrame, указав его в качестве индекса или отдельного столбца.

# Having it as an index

datetime_index = pd.date_range(start='2018-01-01', end='2019-12-31', freq='D')
df = pd.DataFrame({}, index=datetime_index)
# Using numpy.where() to create the Vacation column
df['Vacation'] = np.where((df.index >= '2018-06-24') & (df.index <= '2018-08-24'), 1, 0)

enter image description here

Или

# Having it as a column

datetime_index = pd.date_range(start='2018-01-01', end='2019-12-31', freq='D')
df = pd.DataFrame({'Date': datetime_index})
# Using numpy.where() to create the Vacation column
df['Vacation'] = np.where((df['Date'] >= '2018-06-24') & (df['Date'] <= '2018-08-24'), 1, 0)

enter image description here

Примечание: Отображение только первых пяти строк кадра данных df.

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