Вывести значения в другой заголовок столбца значений в списках - PullRequest
0 голосов
/ 28 августа 2018

Этот код используется для отслеживания доставки с опозданием. Я хочу найти каждый случай поздней доставки и найти номер заказа на покупку, связанный с ним. Мой текущий код может создать список, который показывает количество дней с опозданием для указанного диапазона. Однако, поскольку значения хранятся в списке, я не могу найти, какой номер заказа на покупку связан с поздними днями. Я желаю напечатать в терминале номер заказа на покупку и количество дней, на которое задержка доставки была. (Оттуда я буду использовать оператор if, чтобы видеть только значения> 0, чтобы видеть только, какие поставки были запоздалыми). У меня вопрос, как мне распечатать в терминале номер заказа на покупку с тем количеством опозданий, которое было рядом с ним (я не знаю, как это сделать, поскольку все значения «числа дней с опозданием» хранятся в список)

import csv
import pandas as pd
import datetime


def calculate(number):   
    fileread = pd.read_csv('otd.csv', encoding='latin-1')
    Deliveryvalue = fileread['Delivery Date']
    Desiredvalue = fileread['source desired delivery date']



    date_format = '%m/%d/%Y'

    date1 = datetime.datetime.strptime(Deliveryvalue[number], date_format)
    date2 = datetime.datetime.strptime(Desiredvalue[number], date_format)

    diff= date1 - date2
    diff2 = diff.days



    return diff2

list = [] 
for i in range(1,20):
    list.append(calculate(i))

for y in list: 
    if y > 1:
        print(list)    

печатает это:

[0, 0, 0, 0, 0, 0, 0, 0, -7, 3, 50, 0, 0, 0, 0, 0, 1, -9, 0]
# the negative numbers are early deliveries 

Вот фиктивный пример моего csv-файла:

enter image description here

Ответы [ 3 ]

0 голосов
/ 28 августа 2018

Похоже, вы хотите, чтобы она была частью функции calc (), чтобы вы могли запускать эту функцию для других вещей. Может быть, попробуйте сделать что-то вроде этого:

data = {}
data['ordernum'] = 'ordernum'
data['delayed_days'] = 'diff2'

return data

Таким образом, он в основном возвращает словарь Python (json) каждый раз, когда вы зацикливаете его на строке вашего фрейма данных.

Вот код, с которым я играл:

import csv
import pandas as pd
import datetime


def calculate(row):   
    Deliveryvalue = row['delivery']
    Desiredvalue = row['desired']

    date_format = '%m/%d/%Y'

    date1 = datetime.datetime.strptime(Deliveryvalue, date_format)
    date2 = datetime.datetime.strptime(Desiredvalue, date_format)

    diff= date1 - date2
    diff2 = diff.days

    data = {}
    data['ordernum'] = row['order']
    data['delayed_days'] = diff2

    return data

file = pd.read_csv('otd.csv')

l = []

for index, row in file.iterrows():
    data = calculate(row)
    l.append(data)

print(l)

Я немного изменил то, как работает функция, так что теперь она вместо этого запускается через строки информационного кадра. И если я правильно интерпретирую ваш вопрос, это должно быть решением.

Выход:

{'ordernum': 1, 'delayed_days': 0}
{'ordernum': 2, 'delayed_days': 0}
{'ordernum': 3, 'delayed_days': 0}
{'ordernum': 4, 'delayed_days': 0}
{'ordernum': 5, 'delayed_days': 0}
0 голосов
/ 28 августа 2018

Я выбрал другой подход и сжал ваши столбцы, затем сравнил их. Извините, заголовки выглядят шатко, я не вижу всего этого. Я добавил 2 строки в ваш CSV-файл, чтобы включить поздние поставки. Эти заказы:

Purchase order number    Delivery Date    Source Desired Deliv
17                       2/10/2018        2/5/2018
18                       7/16/2017        7/14/2018

см. Ниже:

import pandas as pd
from datetime import datetime
from datetime import timedelta
import csv

df = pd.read_csv('./Desktop/dummy.csv')
late_items = []
date_format = '%m/%d/%Y'

for x,y,z in zip(df['Purchase order number'], df['Delivery Date'], df['Source desired delive']):
    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
    if diff_deliv_date < timedelta(0):
        late_items.append([x, diff_deliv_date]) 
print(late_items)

Выход:

[[17, datetime.timedelta(-5)], [18, datetime.timedelta(-2)]]

Или сделайте так, просто добавив столбец «Дата доставки» к исходному df:

diff_delivery_date = []
date_format = '%m/%d/%Y'
for x,y,z in zip(df['Purchase order number'], df['Delivery Date'], df['Source desired delive']):
    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
df.loc[df['Diff Deliv Date'] < timedelta(0)] # To get only those values less than 0 for late deliveries.
#df option to output whole df with on time and late deliveries.

выход:

    Purchase order number Delivery Date Source desired delive Diff Deliv Date

5                     17     2/10/2018              2/5/2018         -5 days
6                     18     7/16/2017             7/14/2017         -2 days
0 голосов
/ 28 августа 2018
import pandas as pd

# change names appropriately
PURCHASE_ORDER = 'Purchase Order'
DELIVERY_DATE = 'Delivery Date'
DESIRED_DATE = 'Desired Date'
DELAYED_DAYS = 'Delayed Days'

df = pd.read_csv('otd.csv', index_col=PURCHASE_ORDER)

-

>> df
                  Delivery Date Desired Date
Purchase Order
001               2014-12-31   2014-12-31
002               2014-12-31   2014-12-31
003               2015-01-05   2015-01-05
004               2015-01-05   2015-01-05
005               2015-02-12   2015-02-11
006               2016-02-13   2016-02-11

Последние две поставки задерживаются.

df[DELIVERY_DATE] = pd.to_datetime(df[DELIVERY_DATE])
df[DESIRED_DATE] = pd.to_datetime(df[DESIRED_DATE])
df[DELAYED_DAYS] = df[DELIVERY_DATE] - df[DESIRED_DATE]
late_threshold = pd.Timedelta(days=0)
late_deliveries = df[DELAYED_DAYS] > late_threshold

-

>> df[late_deliveries].drop([DELIVERY_DATE, DESIRED_DATE], axis=1)

                     Delayed Days
Purchase Order             
005                  1 days
006                  2 days
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...