Как нарезать временной ряд Pandas, используя логическое выражение с датами - PullRequest
0 голосов
/ 09 июня 2018

Я хочу понять нарезку с помощью временных рядов в Pandas, и я смотрю на возможность объединения в логическом выражении (объединение и, или не операнды) условий, включающих даты.

Так что это воспроизводимый пример:

HAO_10
Date         Price
2018-01-02  30.240000
2018-01-03  30.629999
2018-01-04  30.860001
2018-01-05  31.010000
2018-01-08  31.389999
2018-01-09  31.309999
2018-01-10  31.400000
2018-01-11  31.580000
2018-01-12  31.680000
2018-01-16  31.200001

HAO_10.iloc[((HAO_10.index < datetime.strptime('2018-01-04', '%Y-%m-%d')) | 

             ((HAO_10.index > datetime.strptime('2018-01-08', '%Y-%m-%d')) & 
        (HAO_10.index  != datetime.strptime('2018-01-12', '%Y-%m-%d')))), ]

Это попытка вырезать значения, соответствующие датам до 2018-01-04 и после 2018-01-08, но не значение, соответствующее дате 2018-01-12.

Это работает.

Есть ли более элегантный способ сделать то же самое?

Ответы [ 2 ]

0 голосов
/ 09 июня 2018

Создайте DatetimeIndex из удаленных значений сначала с date_range и union, затем выберите только difference с исходным индексом:

idx = pd.date_range('2018-01-04','2018-01-08').union(['2018-01-12'])
df = HAO_10.loc[HAO_10.index.difference(idx)]
#another similar solutions
#df = HAO_10.drop(idx, errors='ignore')
#df = HAO_10[~HAO_10.index.isin(idx)]

Если вы хотите работать только с date s и index содержит также time s floor ваш друг:

df = HAO_10.loc[HAO_10.index.floor('d').difference(idx)]
#another similar solutions
#df = HAO_10[~HAO_10.index.floor('d').isin(idx)]

print (df)
                Price
2018-01-02  30.240000
2018-01-03  30.629999
2018-01-09  31.309999
2018-01-10  31.400000
2018-01-11  31.580000
2018-01-16  31.200001

Ваше решениеследует упростить:

df = HAO_10[((HAO_10.index < '2018-01-04') | ((HAO_10.index > '2018-01-08') & 
                  (HAO_10.index  != '2018-01-12')))]
0 голосов
/ 09 июня 2018

Сначала преобразовать в дату и время, используя pd.to_datetime.Затем вы можете использовать строки даты в своем выражении loc:

df['Date'] = pd.to_datetime(df['Date'])

# This says: find where date is not between your range and not equal to 01-12
df.loc[(~df['Date'].between('2018-01-04','2018-01-08')) & (df['Date'] != '2018-01-12')]

        Date      Price
0 2018-01-02  30.240000
1 2018-01-03  30.629999
5 2018-01-09  31.309999
6 2018-01-10  31.400000
7 2018-01-11  31.580000
9 2018-01-16  31.200001
...