Как обрезать выбросы в датах в питоне? - PullRequest
1 голос
/ 25 июня 2019

У меня есть фрейм данных df:

0    2003-01-02
1    2015-10-31
2    2015-11-01
16   2015-11-02
33   2015-11-03
44   2015-11-04

, и я хочу урезать выбросы в датах.Поэтому в этом примере я хочу удалить строку с датой 2003-01-02.Или в больших фреймах данных я хочу удалить даты, которые не лежат в интервале, где лежат 95% или 99%.Есть ли функция, которая может сделать это?

Ответы [ 2 ]

0 голосов
/ 25 июня 2019

Вы можете использовать quantile() для Series или DataFrame .

dates = [datetime.date(2003,1,2),
         datetime.date(2015,10,31),
         datetime.date(2015,11,1),
         datetime.date(2015,11,2),
         datetime.date(2015,11,3),
         datetime.date(2015,11,4)]
df = pd.DataFrame({'DATE': [pd.Timestamp(x) for x in dates]})
print(df)

qa = df['DATE'].quantile(0.1) #lower 10%
qb = df['DATE'].quantile(0.9) #higher 10%

print(qa, qb)

#remove outliers
xf = df[(df['DATE'] >= qa) & (df['DATE'] <= qb)]
print(xf)

Вывод:

        DATE
0 2003-01-02
1 2015-10-31
2 2015-11-01
3 2015-11-02
4 2015-11-03
5 2015-11-04
2009-06-01 12:00:00 2015-11-03 12:00:00
        DATE
1 2015-10-31
2 2015-11-01
3 2015-11-02
4 2015-11-03
0 голосов
/ 25 июня 2019

Предполагается, что ваш столбец преобразован в формат даты и времени:

import pandas as pd
import datetime as dt

df = pd.DataFrame(data)
df = pd.to_datetime(df[0])

Вы можете сделать:

include = df[df.dt.year > 2003]
print(include)

[out]:
1   2015-10-31
2   2015-11-01
3   2015-11-02
4   2015-11-03
5   2015-11-04
Name: 0, dtype: datetime64[ns]

Посмотрите здесь

... относительно вашего ответа (это в основном та же идея, ... будьте изобретательны, мой друг):

s = pd.Series(df)
s10 = s.quantile(.10)
s90 = s.quantile(.90)

my_filtered_data = df[df.dt.year >= s10.year]
my_filtered_data = my_filtered_data[my_filtered_data.dt.year <= s90.year]
...