Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 打印列表中值的不同列标题中的值_Python_Pandas_Csv_Datetime - Fatal编程技术网

Python 打印列表中值的不同列标题中的值

Python 打印列表中值的不同列标题中的值,python,pandas,csv,datetime,Python,Pandas,Csv,Datetime,此代码用于跟踪哪些交货延迟。我希望找到延迟交货的每个实例,并找到与之相关的采购订单号。我当前的代码能够生成一个列表,显示指定范围内的延迟天数。但是,由于这些值存储在一个列表中,因此我无法找到与最近几天相关联的采购订单号。我希望在终端上打印采购订单号和延迟交货天数。(在这里,我将使用if语句只查看大于0的值,只查看哪些交付延迟)。我的问题是,如何在终端中打印采购订单号及其旁边的延迟天数(我不知道如何打印,因为“延迟天数”的所有值都存储在列表中) 打印此文件: [0, 0, 0, 0, 0, 0,

此代码用于跟踪哪些交货延迟。我希望找到延迟交货的每个实例,并找到与之相关的采购订单号。我当前的代码能够生成一个列表,显示指定范围内的延迟天数。但是,由于这些值存储在一个列表中,因此我无法找到与最近几天相关联的采购订单号。我希望在终端上打印采购订单号和延迟交货天数。(在这里,我将使用if语句只查看大于0的值,只查看哪些交付延迟)。我的问题是,如何在终端中打印采购订单号及其旁边的延迟天数(我不知道如何打印,因为“延迟天数”的所有值都存储在列表中)

打印此文件:

[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文件的一个虚拟示例:

-

最后两次交货都晚了

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
-


似乎您希望它成为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)
我对函数的工作方式做了一些修改,所以现在它在数据帧行中运行。Amd如果我对你的问题解释正确,这应该是解决方案

输出:

{'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}

我采取了另一种方法,压缩了你的专栏,然后比较了它们。 对不起,页眉看起来不稳,我看不清全部内容。我在您的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)
或者通过这种方式将“差异交付日期”列添加到原始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.

您的问题是什么?如果您能详细说明一下您的具体要求,那就太好了。@Code pe徒弟,因为我的所有值都在一个列表中,对于延迟交货的天数,我希望能够在终端上清晰地打印延迟天数和旁边的采购订单号。(从那里我会做一个if语句,只显示大于0的值,只看到延迟交付)@josephseungjaedolar我已经更新了我的问题,希望能有所帮助!您好,是的,输出是按照您指定的方式输出的,但是我如何使输出看起来像您拥有的第一个代码块(采购订单编号17和18)您是否希望输出看起来像一个包含两列的数据框:
Purchase order number Diff\u deliver\u date
,下面有相应的数字?这只是一个列表输出。是的,一个带有这些列的数据框,除了在下面,并排排列,以便采购订单号与Diff_deliver_date对齐,类似于您的第一个代码块的查找方式,这就是我要查找的!谢谢发生什么事了?也许我可以帮你解决你正在寻找的问题。是的,这给了我准确的结果,但理想情况下,我正在寻找一种方法,使结果以干净的方式打印出来,我可以显示出来(销售团队和生产团队查看此数据,我有一种感觉,他们将很难阅读此数据),但这很好,谢谢@HarisKhaliq您应该使用它打印列表的部分来实现这一点。我确信JSON对于数据本身来说是最干净的。@HarisKhaliq这就是您所期望的输出。是的!我想我对“采购订单”、“交货日期”和“期望日期”类别中的“假”数据有点困惑,因为我不能简单地将数据放入这样的变量中,这个文件有10000多个lines@HarisKhaliq,我将其更改为模拟从csv文件读取。将密钥名称更改为csv文件中的名称。您好,所以我在终端中注意到,每一行仍然打印,即使是按时或提前交付的内容。你知道为什么会这样吗。我一直在想办法,你确定你使用的是
df[延迟交货]
{'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}
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 = []
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