Этот код используется, чтобы показать, какая доставка опаздывает, распечатывает связанный с ним номер "Материал" и показывает, сколько дней было опоздано с доставкой. Моя проблема теперь заключается в попытке фильтрации набора данных только для чтения определенного диапазона времени; в моем следующем коде я попытался отфильтровать данные с 2017 по 2018 год, однако я получаю ошибку (указанную ниже блоком кода). Как я могу фильтровать строки, чтобы показывать только определенный диапазон времени при проведении одного и того же анализа: чтобы увидеть, какие номера материальных деталей имели позднюю доставку, и посмотреть, сколько дней было поздно (без ошибок)
import pandas as pd
from datetime import datetime
from datetime import timedelta
df = pd.read_csv('otd.csv')
diff_delivery_date = []
date_format = '%m/%d/%Y'
df2 = df[(df['Delivery Date'].dt.year >= 2017) & (df['Delivery Date'].dt.year <= 2018)]
for x,y,z in zip(df2['Material'], df2['Delivery Date'], df2['source desired delivery date']):
actual_deliv_date = datetime.strptime(y, date_format)
supposed_deliv_date = datetime.strptime(z, date_format)
diff_deliv_date = supposed_deliv_date - actual_deliv_date
diff_delivery_date.append(diff_deliv_date)
df['Diff Deliv Date'] = diff_delivery_date
print(df2)
Полная ошибка:
Traceback (most recent call last):
File "C:\Users\khalha\eclipse-workspace\Python\Heyy\Code.py", line 13, in <module>
df2 = df[(df['Delivery Date'].dt.year >= 2017) & (df['Delivery Date'].dt.year <= 2018)]
File "C:\Users\khalha\AppData\Local\Programs\Python\Python37\lib\site-packages\pandas\core\generic.py", line 4372, in __getattr__
return object.__getattribute__(self, name)
File "C:\Users\khalha\AppData\Local\Programs\Python\Python37\lib\site-packages\pandas\core\accessor.py", line 133, in __get__
accessor_obj = self._accessor(obj)
File "C:\Users\khalha\AppData\Local\Programs\Python\Python37\lib\site-packages\pandas\core\indexes\accessors.py", line 325, in __new__
raise AttributeError("Can only use .dt accessor with datetimelike "
AttributeError: Can only use .dt accessor with datetimelike values
Dummy csv: Изображение файла csv
Material Delivery Date source desired delivery date
3334678 12/31/2014 12/31/2014
233433 12/31/2014 12/31/2014
3434343 1/5/2015 1/5/2015
3334567 1/5/2015 1/5/2015
546456 2/11/2015 2/11/2015
221295 4/10/2015 4/10/2015
Пример кадра данных:
Deliveryvalue = df2['11/31/2014', '11/31/2017', '11/31/2018']
Desiredvalue = df2['12/31/2014', '12/21/2017', '12/11/2018']
Я отвечаю, что ваши данные имеют следующий формат:
Material,Delivery Date,source desired delivery date
3334678,12/31/2017,12/31/2017
233433,12/31/2017,12/31/2017
3434343,1/5/2017,1/5/2017
3334567,1/5/2017,1/5/2017
546456,2/11/2017,2/11/2017
221295,4/10/2017,4/10/2017
Итак, предполагая, что вы можете сделать это следующим образом:
import pandas as pd
df = pd.read_csv('odt.csv')
df['Delivery Date'] = pd.to_datetime(df['Delivery Date'], format='%m/%d/%Y')
df['source desired delivery date'] = pd.to_datetime(df['source desired delivery date'], format='%m/%d/%Y')
df2 = df[(df['Delivery Date'].dt.year >= 2017) & (df['Delivery Date'].dt.year <= 2018)]
df2['Diff Deliv Date'] = df2['Delivery Date'] - df2['source desired delivery date']
print(df2)
Выход
Material Delivery Date source desired delivery date Diff Deliv Date
0 3334678 2017-12-31 2017-12-31 0 days
1 233433 2017-12-31 2017-12-31 0 days
2 3434343 2017-01-05 2017-01-05 0 days
3 3334567 2017-01-05 2017-01-05 0 days
4 546456 2017-02-11 2017-02-11 0 days
5 221295 2017-04-10 2017-04-10 0 days
Заметки
После загрузки данных типы столбцов, в которых указано следующее:
Material int64
Delivery Date object
source desired delivery date object
Вы можете проверить, есть ли у вас это. Затем вам нужно преобразовать 'Delivery Date'
и 'source desired delivery date'
в datetime, это делается в:
df['Delivery Date'] = pd.to_datetime(df['Delivery Date'], format='%m/%d/%Y')
df['source desired delivery date'] = pd.to_datetime(df['source desired delivery date'], format='%m/%d/%Y')
Затем просто отфильтруйте данные и вычислите разницу. Также я изменил:
df['Diff Deliv Date'] = diff_delivery_date
на df2
чем ваш код печатает df2
в конце.