Фильтрация строк по годам; AttributeError: может использовать только метод доступа .dt со значениями типа datetime - PullRequest
0 голосов
/ 30 августа 2018

Этот код используется, чтобы показать, какие поставки опоздали, распечатать номер «Материала», связанный с ним, и показать, на сколько дней была задержка доставки. Моя проблема сейчас заключается в попытке отфильтровать набор данных, чтобы прочитать только определенный интервал времени; в моем следующем коде я попытался отфильтровать данные с 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

Пустышка 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']

1 Ответ

0 голосов
/ 30 августа 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 в конце.

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