Сложный расчет даты в DataFrame в Python Pandas?

У меня есть DataFrame, как показано ниже:

rng = pd.date_range('2020-12-11', periods=5, freq='T')
df = pd.DataFrame({ 'Date': rng, 'status': ['active', 'active', 'finished', 'finished', 'active'] }) 

И мне нужно создать 2 новых столбца в этом DataFrame:

  1. New1 = количество дней от столбца «Дата» до сегодняшнего дня для статуса «активен»
  2. New2 = количество дней от столбца «Дата» до сегодняшнего дня для статуса «завершено»

Ниже образец результата:

Как выглядят новые столбцы по демонстрационным данным?

jezrael 14.12.2020 11:46

Я добавил образцы результатов

dingaro 14.12.2020 12:01
Почему в 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 может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
2
56
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Используйте Series.rsub для вычитания из правой части сегодняшнего дня с помощью Timestamp и Timestamp.floor , конвертируйте временные дельты в дни с помощью Series.dt.days и назначайте новые столбцы по условию в Series .где:

rng = pd.date_range('2020-12-01', periods=5, freq='D')
df = pd.DataFrame({ 'Date': rng, 
                    'status': ['active', 'active', 'finished', 'finished', 'active'] }) 

days = df['Date'].rsub(pd.Timestamp('now').floor('d')).dt.days

df['New1'] = days.where(df['status'].eq('active'))
df['New2'] = days.where(df['status'].eq('finished'))
print (df)
        Date    status  New1  New2
0 2020-12-01    active  13.0   NaN
1 2020-12-02    active  12.0   NaN
2 2020-12-03  finished   NaN  11.0
3 2020-12-04  finished   NaN  10.0
4 2020-12-05    active   9.0   NaN

У меня есть ошибка, как показано ниже, после вашего кода: TypeError: неподдерживаемый тип (ы) операнда для -: «Timestamp» и «str»

dingaro 14.12.2020 12:10

@rumor154 — Являются ли значения в столбце Date датой и временем? Кажется, нет, поэтому используйте df['Date'] = pd.to_datetime(df['Date']) перед days = df['Date'].rsub(pd.Timestamp('now').floor('d')).dt.days

jezrael 14.12.2020 12:11

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