如何从数据框中删除负数时间?

时间:2018-12-15 22:27:35

标签: python pandas datetime dataframe

我在熊猫中创建了一个数据框,其中显示了完成一个工作订单所花费的总时间。由于人为输入错误,某些时间的计算结果是负数,正如您在第30行中看到的那样,即使我将自己换成PM,由于工作时间介于07:30-16:00之间,它仍然会给出错误的时间,最好不理会这些时间

Work Order  WorkType        AST                 AFT             comp_time
10  BAEBRO-898690   RM  1900-01-01 06:27:41 1900-01-01 08:05:28 01:37:47
13  BAEBRO-914693   RM  1900-01-01 08:30:00 1900-01-01 09:00:00 00:30:00
27  BAEBRO-898787   RM  1900-01-01 10:00:00 1900-01-01 10:30:00 00:30:00
30  BAEBRO-914680   RM  1900-01-01 14:32:08 1900-01-01 10:37:17 -1 days +20:05:09
37  BAEBRO-914660   RM  1900-01-01 10:47:39 1900-01-01 11:32:02 00:44:23`

我要得到此结果的代码是:

import pandas as pd
from datetime import time
from datetime import timedelta
from pandas import DataFrame
import matplotlib as plt

df = pd.read_excel('C:/Users/Nativ_Zero/Desktop/work data/July.xls')

df_work = df[['Work Order', 'WorkType', 'AST','AFT']]

df_work['AFT'] = pd.to_datetime(df_work['AFT'], format='%H:%M:%S', errors='coerce')
df_work['AST'] = pd.to_datetime(df_work['AST'], format='%H:%M:%S', errors='coerce')

rm_work = df_work[df_work.WorkType == 'RM']


rm_work['comp_time'] = rm_work['AFT'] - rm_work['AST']
rm_work.head()

2 个答案:

答案 0 :(得分:1)

使用 .apply() 检查 pandas 时间是否为负(务必与 pd.Timedelta(0) 而不是 0 进行比较,因为这会出错)。如果为负,则返回一个 numpy NaN。最后,排除带有 NaN 的行。

如果您的列中已经有 NaN 并且想要保留它们,这将导致问题!在这种情况下,您可以更改方法以返回其他内容,然后排除该唯一值。

def check_if_negative(pd_time):
    if pd_time >= pd.Timedelta(0): # positive time and 0 time
        return pd_time
    elif pd_time < pd.Timedelta(0): # negative time
        return np.NaN
    else:
        print(f'problem! {pd_time} has an issue') # quick error check

rm_work['comp_time'] = rm_work['AFT'] - rm_work['AST'] # create timedelta
rm_work['comp_time'] = rm_work.comp_time.apply(check_if_negative) # apply check to column

rm_work = rm_work.dropna(subset=['comp_time']) # delete rows with NaN

答案 1 :(得分:0)

下面的代码将为您工作:

done

您需要使用适当的dtypes(在这种情况下为findPeopleByName)进行比较。