【问题标题】:Rows not filtering when writing to CSV file写入 CSV 文件时未过滤的行
【发布时间】:2018-08-30 18:39:00
【问题描述】:

此代码用于查找特定时间范围内的延迟交货(在本示例中为 2018 年)并将数据写入 csv 文件 (otdedit.csv)。但是,尽管数据按年份正确过滤,但未过滤掉未延迟交付的值。我的问题是,我如何过滤掉只有延迟交付才能写入 csv 文件 otdedit.csv 的行。

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


PURCHASE_ORDER = 'Material'
DELIVERY_DATE = 'Delivery Date'
DESIRED_DATE = 'Desired Delivery'
DELAYED_DAYS = 'Delayed Days'

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

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)



df['Delivery Date'] = pd.to_datetime(df['Delivery Date'], format='%m/%d/%Y')
df['Desired Delivery'] = pd.to_datetime(df['Desired Delivery'], format='%m/%d/%Y')

df2 = df[(df['Delivery Date'].dt.year >= 2018) & (df['Delivery Date'].dt.year <= 2018)]
df2['Diff Deliv Date'] = df2['Delivery Date'] - df2['Desired Delivery']




df2.to_csv('otdedit.csv', sep=',')

这是 otdedit.csv 的快照,请注意延迟天数为 0 的行仍然出现。

(另外作为旁注,我不知道为什么这个程序也没有按标题过滤,我只希望出现这 4 列,但是原始文件中的每一列都显示(我已经隐藏了这些列快照)

如果需要,这里还有示例数据:

Material    Delivery Date   Desired Delivery    Delayed Days    Diff Deliv Date
20030650    1/3/2018    12/22/2017  12 days 00:00:00.000    12 days 00:00:00.00000
20056352    1/2/2018    12/31/2017  2 days 00:00:00.00000   2 days 00:00:00.000000
20052196    10/18/2018  10/18/2018  0 days 00:00:00.0000    0 days 00:00:00.0000000
20031687    1/3/2018    12/27/2017  7 days 00:00:00.0000    7 days 00:00:00.000000
20031687    2/3/2018    2/3/2018    0 days 00:00:00.00000   0 days 00:00:00.000000
20056053    5/14/2018   3/11/2017   429 days 00:00:00.00    429 days 00:00:00.0000000
20070547    1/2/2018    8/15/2017   140 days 00:00:00.0000  140 days 00:00:00.00

【问题讨论】:

  • 嘿,你能给我们提供csv格式的示例数据还是使用df2.to_dict()的输出?

标签: python pandas csv datetime export-to-csv


【解决方案1】:

线

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

正在将视图的 副本 创建到原始数据框中,并删除了给定的列,但是您没有将此副本分配给任何东西。原始数据框df 保持不变。

创建 df2 后你可以做的是:

df2 = df2[df2[DELAYED_DAYS] > late_threshold]
df2.drop([DELIVERY_DATE, DESIRED_DATE], axis=1, inplace=True)

【讨论】:

    猜你喜欢
    • 2020-05-26
    • 2016-06-14
    • 1970-01-01
    • 2015-09-16
    • 2020-05-31
    • 2012-07-24
    • 2018-05-12
    • 1970-01-01
    • 2021-05-07
    相关资源
    最近更新 更多