Python / Pandas drop row на основе текущего месяца - PullRequest
1 голос
/ 16 июня 2020

Я хотел бы удалить строки в DF, используя системную дату для текущего месяца и года. Фильтр на основе приведенной ниже версии SAP = "70" И FY = "Текущий год" И Period = "Текущий месяц"

Примечание. При использовании системной даты или pandas функции даты / времени

Текущий DF:

| Project No | SAP Version | FY   | Period | value    |
|------------|-------------|------|--------|----------|
| 0-01241    | 70          | 2020 | Jun    | 712.95   |
| 0-01214    | 70          | 2020 | Jun    | 388      |
| 0-01214    | 70          | 2020 | Jun    | 9        |
| 0-01214    | 70          | 2020 | Oct    | 11495.68 |
| 0-01214    | 70          | 2020 | Nov    | 164307.7 |
| 0-01214    | 70          | 2020 | Dec    | 106296.3 |
| 0-01241    | 70          | 2020 | Jun    | 1425     |
| 0-01214    | 70          | 2020 | Jun    | -204.96  |
| 0-01214    | 70          | 2020 | Jan    | 125754.7 |
| 0-01214    | 70          | 2020 | Feb    | 245261.3 |
| 0-01214    | 70          | 2020 | Mar    | 57879.14 |

Ожидаемый DF:

| Project No | SAP Version | FY   | Period | value    |
|------------|-------------|------|--------|----------|
| 0-01214    | 70          | 2020 | Oct    | 11495.68 |
| 0-01214    | 70          | 2020 | Nov    | 164307.7 |
| 0-01214    | 70          | 2020 | Dec    | 106296.3 |
| 0-01214    | 70          | 2020 | Jan    | 125754.7 |
| 0-01214    | 70          | 2020 | Feb    | 245261.3 |
| 0-01214    | 70          | 2020 | Mar    | 57879.14 |

Ответы [ 3 ]

3 голосов
/ 16 июня 2020

Создайте 3 условия со сравнением по Series.eq с 70, фактическим годом и преобразованной строкой даты и времени в месяц %b и Timestamp.strftime, затем объедините все по & для побитового AND и последнего фильтра по инвертированной маске ~ в boolean indexing:

now = pd.Timestamp('now')

mask = df['SAP Version'].eq(70) & df['FY'].eq(now.year) & df['Period'].eq(now.strftime('%b'))
df = df[~mask]

Альтернативный вариант - это 'invert' решение с eq до ne для не равно, & для | для побитового OR и удалено ~:

mask = df['SAP Version'].ne(70) | df['FY'].ne(now.year) | df['Period'].ne(now.strftime('%b'))

df = df[mask]

print (df)
   Project No  SAP Version    FY Period      value
3     0-01214           70  2020    Oct   11495.68
4     0-01214           70  2020    Nov  164307.70
5     0-01214           70  2020    Dec  106296.30
8     0-01214           70  2020    Jan  125754.70
9     0-01214           70  2020    Feb  245261.30
10    0-01214           70  2020    Mar   57879.14
2 голосов
/ 16 июня 2020

Вы можете найти текущую дату в Python, используя datetime, и использовать ее для фильтрации вашего фрейма данных следующим образом:

In [40]: from datetime import datetime

In [44]: today = datetime.today().strftime('%Y-%b-%d') 
In [46]: curr_year = int(today.split('-')[0])
In [48]: curr_month = today.split('-')[1]

In [49]: df[(df['SAP Version'].eq(70)) & (df['FY'].eq(curr_year)) & (df['Period'].ne(curr_month))]

Пример фрейма данных:

In [66]: df = pd.DataFrame({'SAP Version': [70,70,80], 'FY':[2020,2020,2020], 'Period':['Jun','Aug','Jan']})

In [60]: df 
Out[60]: 
   SAP Version    FY Period
0           70  2020    Jun
1           70  2020    Aug
2           80  2020    Jan

In [59]: df[(df['SAP Version'].eq(70)) & (df['FY'].eq(curr_year)) & (df['Period'].ne(curr_month))]
Out[59]: 
   SAP Version    FY Period
1           70  2020    Aug
0 голосов
/ 17 июня 2020

@ jezrael ответ с небольшой модификацией работал magi c. Спасибо

now = pd.Timestamp('now')

mask = DF['SAP Version'].ne(70) | DF['FY'].ne(now.strftime('%Y'))  | DF['Period'].ne(now.strftime('%b'))

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