Как выполнить поиск ошибок (дат) в наборе данных и заменить их на основе критериев? - PullRequest
2 голосов
/ 13 мая 2019

Я сортирую большой старый набор данных с несколькими ошибками ввода.Я хочу очистить документы путем перебора строки, чтобы найти и изменить ошибки типа на основе критериев.Теперь я получаю ошибку ниже, когда пытаюсь удалить час-минуту-секунду в пандах.

Out of bounds nanosecond timestamp: 3016-03-09 00:00:00

Я думаю, что-то вроде:

import pandas as pd

df = pd.read_excel(r'raw data.xlsx', header = 0)


for date in Dates:
    if date is out of bounds date time:
        replace str[0-3] with Year, inplace = True


df['Date'].dt.year,month,day

print(df)

Типичная ошибка при наборе данных можетбыть датой в элементе 4

Item    Description Date    Year    ...
1   Ketchup400  2015-10-27 00:00:00 2015    ...
2   Ketchup600  2018-02-16 00:00:00 2018    ...
3   Mustard800  2015-10-02 00:00:00 2015    ...
4   Mustard200  3016-03-09 00:00:00 2016    ...
1   Ketchup400  2018-02-26 00:00:00 2018    ...
... ... ... ... ...

Я хочу удалить часы, минуты и секунды из дат, исправить даты и напечатать новый файл ... Результат должен быть примерно таким:

Item    Description Date    Year    ...
1   Ketchup400  2015-10-27  2015    ...
2   Ketchup600  2018-02-16  2018    ...
3   Mustard800  2015-10-02  2015    ...
4   Mustard200  2016-03-09  2016    ...
1   Ketchup400  2018-02-26  2018    ...
... ... ... ... ...

Ответы [ 2 ]

2 голосов
/ 13 мая 2019

Самым простым решением является добавление столбца Year к разделенному столбцу Date по первому - и преобразование в datetime:

s = df['Year'].astype(str) + '-' + df['Date'].astype(str).str.split('-', n=1).str[1]
df['Date'] = pd.to_datetime(s, errors='coerce')
print (df)
   Item Description       Date  Year  ...
0     1  Ketchup400 2015-10-27  2015  ...
1     2  Ketchup600 2018-02-16  2018  ...
2     3  Mustard800 2015-10-02  2015  ...
3     4  Mustard200 2016-03-09  2016  ...
4     1  Ketchup400 2018-02-26  2018  ...

Другое решение с более высокой производительностью - получить все непроанализированные значения времени на to_datetime и errors='coerce' параметр, анализируя только эти отфильтрованные строки, проверяя пропущенные значения и добавляя к оригиналу Series.combine_first строк, обрабатывает как первое решение:

date = pd.to_datetime(df['Date'], errors='coerce')

df1 = df[date.isna()]
print (df1)
   Item Description                 Date  Year  ...
3     4  Mustard200  3016-03-09 00:00:00  2016  ...

s = (pd.to_datetime(df1['Year'].astype(str) + '-' + 
                    df1['Date'].astype(str).str.split('-', n=1).str[1]))
print (s)
3   2016-03-09
dtype: datetime64[ns]

df['Date'] = date.combine_first(s)
print (df)
   Item Description       Date  Year  ...
0     1  Ketchup400 2015-10-27  2015  ...
1     2  Ketchup600 2018-02-16  2018  ...
2     3  Mustard800 2015-10-02  2015  ...
3     4  Mustard200 2016-03-09  2016  ...
4     1  Ketchup400 2018-02-26  2018  ...
1 голос
/ 13 мая 2019

Вы можете попробовать это, а также получить недействительные даты как NaT;)

df['Date2'] = pd.to_datetime(df['Date'], errors='coerce')

Примечание:

      Item Description                 Date  Year
0     1  Ketchup400  2015-10-27 00:00:00  2015
1     2  Ketchup600  2018-02-16 00:00:00  2018
2     3  Mustard800  2015-10-02 00:00:00  2015
3     4  Mustard200  3016-03-09 00:00:00  2016
4     1  Ketchup400  2018-02-26 00:00:00  2018
   Item Description                 Date  Year      Date2
0     1  Ketchup400  2015-10-27 00:00:00  2015 2015-10-27
1     2  Ketchup600  2018-02-16 00:00:00  2018 2018-02-16
2     3  Mustard800  2015-10-02 00:00:00  2015 2015-10-02
3     4  Mustard200  3016-03-09 00:00:00  2016        NaT
4     1  Ketchup400  2018-02-26 00:00:00  2018 2018-02-26

А затем вручную исправьте ошибки синтаксического анализа, если это возможно, потому что NaT поможет вам определить проблемы.

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