【问题标题】:Print values in a different column header of values in lists在列表中值的不同列标题中打印值
【发布时间】:2019-02-02 12:04:00
【问题描述】:

此代码用于跟踪哪些交货延迟。我希望找到每个延迟交货的实例并找到与之关联的采购订单号。我当前的代码能够生成一个列表,显示指定范围内迟到的天数。但是,由于这些值存储在列表中,我无法找到与后期相关的采购订单编号。我希望在终端打印采购订单号和交货延迟天数。 (从那里我将使用 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 文件的一个虚拟示例:

【问题讨论】:

  • 你的问题是什么?
  • 如果您能详细说明您的要求,那就太好了。
  • @Code-Apprentice,因为我所有的值都在一个列表中,对于交货延迟的天数,我希望能够在终端中干净地打印延迟天数和旁边的采购订单号。 (从那里我会做一个 if 语句,只显示大于 0 的值,只看到延迟交货)
  • @JosephSeungJaeDollar 我已经更新了我的问题,希望对您有所帮助!

标签: python pandas csv datetime


【解决方案1】:
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

【讨论】:

  • @HarisKhaliq 这是您所期望的输出。
  • 是的!我想我对“采购订单”、“交货日期”和“所需日期”类别中的“假”数据有点困惑,因为我不能简单地将数据放入这样的变量中,这个文件有超过 10000 行
  • @HarisKhaliq,我将其更改为模拟从 csv 文件读取。将密钥名称更改为 csv 文件中的名称。
  • 嗨,所以我在终端中注意到,每一行仍在打印,即使是准时或提前交货。关于为什么会发生这种情况的任何想法。一直在想办法
  • 你确定你使用的是df[late_deliveries]
【解决方案2】:

似乎您希望它成为 calculate() 函数的一部分,以便您可以在其他东西上运行该函数。也许尝试做这样的事情:

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}

【讨论】:

  • 是的,这给了我准确的结果,但理想情况下,我正在寻找一种以干净的方式打印结果的方法,以便我可以显示(销售团队和生产团队查看这些数据,我有感觉,他们会很难读到这篇文章)但这很好,谢谢!
  • @HarisKhaliq 您应该使用打印列表的部分来实现这一目标。我确信 JSON 对于数据本身来说是最干净的。
【解决方案3】:

我采用了不同的方法,将您的列拉上拉链,然后进行比较。 抱歉,标题看起来很不稳定,我看不到整件事。我在您的 csv 文件中添加了 2 行以包含延迟交货。这些命令是:

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)]]

或者这样做只是将“Diff Delivery Date”列添加到您的原始 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

【讨论】:

  • 嗨,是的,输出按照您指定的方式输出,但是我如何让输出看起来像您拥有的第一个代码块(采购订单编号为 17 和 18)
  • 您是否希望输出看起来像一个有 2 列的数据框:Purchase order number Diff_deliv_date,下面有相应的数字?这只是一个列表输出。
  • 是的,包含这些列的数据框,除了在下面,并排,以便采购订单号与 Diff_deliv_date 对齐,类似于您的第一个代码块的外观
  • 是的,这就是我要找的!谢谢
  • 发生了什么?也许我可以帮助您解决您正在寻找的问题。
猜你喜欢
  • 2015-04-23
  • 1970-01-01
  • 2019-11-29
  • 2018-03-13
  • 1970-01-01
  • 2021-04-09
  • 1970-01-01
  • 1970-01-01
  • 2020-11-06
相关资源
最近更新 更多