Цикл для сравнения дат в Python

#python #pandas #dataframe

Вопрос:

Я хочу написать цикл, в котором, например, если «дата заказа» равна «дате доставки», это даст мне категориальное значение (1 или 0) в новом столбце.

Ниже приведен код, который я пробовал:

 pl['same_jb_sr'] = 0

for dates in pl.iterrows():
    if pl['SampleReceivedDate'] != pl['JobCreationDate']:
        pl.loc['same_jb_sr'] = 1 
    else:
        pl.loc['same_jb_sr'] = 0
 

SampleReceivedDate и JobCreationDate имеют тип данных «Datetime64 [ns]».

Ошибка:

Значение истинности ряда неоднозначно. Используйте.empty, a.bool(), a.item(), a.any() или a.all().

Комментарии:

1. Что такое структура данных pl ? Словарь, фрейм даты или что-то еще? В чем заключается сообщение об ошибке? Можете ли вы включить содержание pl в свой вопрос?

2. Привет, pl-это фрейм данных

Ответ №1:

Вы не написали цикл. Например, см. ниже:

 for pl in data:
    pl['same_jb_sr'] = int(pl['SampleReceivedDate'] != pl['JobCreationDate'])
 

Я использовал int здесь , поскольку операция возвращает a bool , и при ее использовании int она превращается в 1 if True и 0 if False , поэтому нет необходимости в операторе if/else.

Комментарии:

1. Привет, Джеб, я использовал ваш код, и это было сообщение об ошибке, которое я получил: «Ошибка типа: не удается преобразовать серию в <класс ‘int’>». Тип данных для «sampleReceivedDate» и «Дата создания задания» — datetime64 [ns].

Ответ №2:

Если вы все еще ищете решение:

 pl["same_jb_sr"] = 0
pl.loc[pl["SampleReceivedDate"] != pl["JobCreationDate"], "same_jb_sr"] = 1
 

Результат для образца фрейма данных

 pl = pd.DataFrame(
    {"SampleReceivedDate": pd.to_datetime(["2021-01-01", "2021-01-02", "2021-01-03"]),
     "JobCreationDate": pd.to_datetime(["2021-01-01", "2021-01-01", "2021-01-01"])}
)
 
   SampleReceivedDate JobCreationDate
0         2021-01-01      2021-01-01
1         2021-01-02      2021-01-01
2         2021-01-03      2021-01-01
 

является

   SampleReceivedDate JobCreationDate  same_jb_sr
0         2021-01-01      2021-01-01           0
1         2021-01-02      2021-01-01           1
2         2021-01-03      2021-01-01           1