Фильтр по предыдущему рабочему дню в Pandas

У меня возникла глупая проблема, когда я не могу заставить фильтр предыдущего рабочего дня правильно работать в pandas. Я знаю, что решение, вероятно, простое, но я не могу туда добраться. Вот код, который я использую, который возвращает пустой фрейм данных. Причина, по которой я привожу переменную previous_day к datetime, заключается в том, что ранее в коде я привожу все свои даты к этому формату. Первоначально я думал, что проблема связана с типом даты, однако она сохраняется, несмотря ни на что.

import pandas as pd
from pandas.tseries.offsets import BDay
import datetime

today = datetime.datetime.today()
previous_day = pd.to_datetime(today - BDay(1))
df = df[(df['Invoice Submit Date - Date'] == previous_day)]

это возвращает следующее

Empty DataFrame
Columns: [Invoice Submit Date - Date, Invoice Number, Invoice ID, Invoice Date Created - Date, 
Invoice Date - Date, Approved Date - Date, Invoice Status, Preparer - User, sum(Invoice Spend)]
Index: []

Обновление: это результат df.head()

Что такое dtype df[Invoice Submit Date - Date]?

Equinox 18.12.2020 18:01

@venky__ datetime64

Alex Dowd 18.12.2020 18:57
Почему в 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
2
127
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

format = "%Y/%m/%d"
df['Invoice Submit Date - Date'] = pd.to_datetime(df['Invoice Submit Date - Date'],format)

это то, что вам нужно где-то, прежде чем вы сравните даты ...

где строка формата соответствует дате и времени в загруженном кадре данных

Все равно получите тот же результат

Alex Dowd 18.12.2020 18:57

Не могли бы вы распечатать df, чтобы мы могли увидеть данные?

Paul Brennan 18.12.2020 19:02

df пуст, когда я запускаю эту команду. тип данных рассматриваемого поля - datetime64

Alex Dowd 18.12.2020 19:05

Тогда нет «Даты отправки счета-даты» в предыдущий день.

Paul Brennan 18.12.2020 19:53

Я по-прежнему получаю тот же результат: сегодня = datetime.datetime.today(),,,, previous_day = df['Дата отправки счета - Дата'] - BDay(1)..... df = df[(df ['Дата отправки счета - Дата'] == предыдущий_день)]

Alex Dowd 18.12.2020 20:33

прямо при загрузке вашего фрейма данных вы можете ввести print(df.head()) и вставить результаты в вопрос?

Paul Brennan 18.12.2020 21:06

я добавил это

Alex Dowd 18.12.2020 22:05

Спасибо! format = "%Y-%m-%d"df['Invoice Submit Date - Date'] = pd.to_datetime(df['Invoice Submit Date - Date'],format)testdate = pd.to_datetime('2020-12-04',format='%Y-%m-%d')dftest = df[df['Invoice Submit Date - Date'] == testdate]print(dftest) Это должно дать вам только строку номер 2. Это было бы хорошим испытанием.

Paul Brennan 18.12.2020 23:32

Спасибо, Пол, мне нужно, чтобы тестовая дата была предыдущим рабочим днем, а не жестко закодированной датой. когда я пытаюсь использовать BDay, он по-прежнему не дает мне записей. предыдущий_день = df['Дата отправки счета - Дата'] - BDay(1) df = df[(df['Дата отправки счета - Дата'] == предыдущий_день)]

Alex Dowd 21.12.2020 19:13
Ответ принят как подходящий

Это не самое элегантное решение, но это сработало для меня, если у других возникают проблемы:

import datetime as dt
import pandas as pd
from pandas.tseries.offsets import BDay

# filter on previous business day's date
today = dt.datetime.today()
df['previous_day'] = (today - BDay(1))
df['previous_day'] = df['previous_day'].dt.normalize()
previous_day = df['previous_day']

# new dataframe
df = df[(df['Invoice Submit Date - Date']) == previous_day]

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