Панды, как игнорировать ячейки столбца, которые не могут быть преобразованы в дату и время для расчета дельты времени - PullRequest
1 голос
/ 18 июня 2019

У меня есть df,

doc_date    date_string
2019-06-03  WW0306
2019-06-07  EH0706
2019-08-08  19685
2019-08-09  258
2019-08-10  441573556

doc_date имеет dateimte64 dtype, date_string равно string, удаление нецифровых символов,

s = df['date_string'].str.replace(r'\D+', '')

doc_date    date_string
2019-06-03  0306
2019-06-07  0706
2019-08-08  19685
2019-08-09  258
2019-08-10  441573556

s1 = to_datetime(s, errors='ignore', format='%d%m')

doc_date    date_string
2019-06-03  1900-06-03
2019-06-07  1900-06-07
2019-08-08  19685
2019-08-09  258
2019-08-10  441573556

Здесь мне интересно, как игнорировать те строки, чьи date_string не могут быть преобразованы в datetime;поэтому я могу создать логическую маску как

 c1 = (df.doc_date.dt.dayofyear - s1.dt.dayofyear).abs().le(180)

Другое дело, как получить c1 такой же длины, как у s, которую получит любой date_string, который не может быть преобразован в datetimeFalse в c1;

1 Ответ

1 голос
/ 18 июня 2019

Используйте errors='coerce' для преобразования несоответствующих значений шаблона в NaT для рабочих функций типа datetime:

s1 = to_datetime(s, errors='coerce', format='%d%m')

Или более распространенное использование (панды 0.24.2, поэтому другой выход):

import pandas as pd

s1 = pd.to_datetime(s, errors='coerce', format='%d%m')
print (s1)
0   1900-06-03
1   1900-06-07
2          NaT
3   1900-08-25
4          NaT
Name: date_string, dtype: datetime64[ns]

Все вместе:

#if necessary
#df['doc_date'] =  pd.to_datetime(df['doc_date'])

s = df['date_string'].str.replace(r'\D+', '')

s1 = pd.to_datetime(s, errors='coerce', format='%d%m')

c1 = (df.doc_date.dt.dayofyear - s1.dt.dayofyear).abs().le(180)
print (c1)
0     True
1     True
2    False
3     True
4    False
dtype: bool
...