Панды - условная логика с объектами даты - PullRequest
0 голосов
/ 19 апреля 2019

Кажется, что, несмотря на тот факт, что когда я проверяю свои столбцы панд и он возвращает dtype dtype: datetime64[ns], я не могу получить приведенные ниже два столбца в моем коде для сравнения во время условного оператора (Completed Date

Ошибка, которую я получаю из строки 4 строки снизу вверх: скопировано ниже

finaldf.loc[(finaldf['Original_Due_Date' >= 'Completed_Date'),'On_Time_Units'] = 'Order_Qty'

Ошибка:

 ValueError: could not convert string to Timestamp

Полный код ниже (не может опубликовать набор данных, потому что он является личным)

if day_of_week !=0:
    finaldf['Completed_Date'] = pd.to_datetime(finaldf['Completed_Date'], format="%m/%d/%Y")
    finaldf['Due_Date'] = pd.to_datetime(finaldf['Due_Date'], format="%m/%d/%y") # making it lower case y made it work
    current_week_flags = (finaldf.Completed_Date >= last_monday) & (finaldf.Completed_Date <= today)
    finaldf.loc[(finaldf['Completed_Date'] >= last_monday) & (finaldf['Completed_Date'] <= today) & (finaldf['Due_Date'] < last_monday), 'Due_Date'] = last_monday
    #appears to be working great as of 4.17
    finaldf = finaldf.merge(origdue, on='Work_Order', how= 'left') #vlookup, puts column on outer right 
    finaldf = finaldf.merge(rcode, on='Work_Order', how= 'left')

    #above was working on 4.17
    test = (finaldf.Due_Date >= last_monday) & (finaldf.Due_Date < today)
    finaldf = finaldf[test]
    #above we filtered for the date range, mind the test is  boolean, that called it back in if the value is true

    finaldf = finaldf[finaldf.WO_Stat.str.contains('Complete', na=False)] #make df only contain complete orders
    #the above appears to work great as of 4.18

    #newcolumns = ['Days_Late', 'New_Days_Late', 'Status', 'Day', 'On_Time/Late', 'Cust_PO_#&_WO']
    #finaldf = finaldf.reindex(columns = newcolumns)
    finaldf = finaldf.assign(Days_Late = "", New_Days_Late="", Status="", Day="", On_Time_or_Late="", Cust_PO_WO="", On_Time_Units="", On_Time_Orders="")
    finaldf = finaldf[['column1,column2,Original_Due_Date,column3']]
    #finaldf['Completed_Date'] = pd.to_datetime(finaldf['Completed_Date'], format="%m/%d/%Y").dt.date()
    #finaldf['Orginal_Due_Date'] = pd.to_datetime(finaldf['Original_Due_Date'], format="%m/%d/%Y").dt.date()
    finaldf.loc[(finaldf['Original_Due_Date']>= 'Completed_Date'),'On_Time_Units'] = 'Order_Qty'
    writer = pd.ExcelWriter('currentweek.xlsx', engine='xlsxwriter')
    finaldf.to_excel(writer, index=False, sheet_name='Sheet1')    
    writer.save()

1 Ответ

1 голос
/ 19 апреля 2019

Что это значит?

finaldf['Original_Due_Date' >= 'Completed_Date'

Это грамматически неверно, должно быть

finaldf['Original_Due_Date'] >= 'Completed_Date'

Даже тогда вы сравниваете Timestamp (finaldf['Original_Due_Date']) с str ('Completed_Date'), отсюда и ошибка. Я думаю, что вы имели в виду:

finaldf['Original_Due_Date'] >= finaldf['Completed_Date']

PS: Если это работает, не забудьте отозвать и принять ответ: D.

PPS: изменить для обновленных вопросов:

flags = (finaldf['Original_Due_Date'] >= finaldf['Completed_Date'])

finaldf.loc[flags, 'On_Time_Units'] = finaldf.loc[flags, 'Order_Qty']

Вот и все, я больше не отвечаю на вопрос.

finaldf.loc[(finaldf['Original_Due_Date']>= finaldf['Completed_Date']),'On_Time_Units'] = finaldf.Order_Qty

Это тоже работает:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...