Как найти минимальное значение между двумя датами и поместить в новый столбец с помощью панд - PullRequest
0 голосов
/ 11 октября 2019

У меня есть 2 набор данных

# df1 - minute based dataset

date                  Open
2018-01-01 00:00:00   1.0516 
2018-01-01 00:01:00   1.0516 
2018-01-01 00:02:00   1.0516 
2018-01-01 00:03:00   1.0516 
2018-01-01 00:04:00   1.0516 
....

# df2 - daily based dataset

date_from             date_to
2018-01-01            2018-01-01 02:21:00
2018-01-02            2018-01-02 01:43:00
2018-01-03            NA
2018-01-04            2018-01-04 03:11:00
2018-01-05            2018-01-05 00:19:00

Для каждого значения в df2, date_from и date_to я хочу получить значение minimum/low в Open в df1 и поместите его в новый столбец в df2 с именем min_value

df1 - это отсортированный по минутам набор данных.

Для NA в date_to в df2, мы можем полностью пропустить эту строку и перейти к следующей строке.

Что я сделал?

  • Сначала я попытался найти значениямежду двумя датами.

  • после этого я использовал этот код:

    df2['min_value'] =
     df1[df1['date'].dt.hour.between(df2['date_from'], df2['date_to'])].min()
    

Я хотел найти between две даты, но яне уверен, если это как это сделать.

однако это не работает. Не могли бы вы помочь определить, что мне делать?

Ответы [ 2 ]

1 голос
/ 11 октября 2019

У вас это работает?

df1 = pd.DataFrame({'date':['2018-01-01 00:00:00', '2018-01-01 00:01:00', '2018-01-01 00:02:00', '2018-01-01 00:03:00','2018-01-01 00:04:00'],
                   'Open':[1.0516, 1.0516, 1.0516, 1.0516, 1.0516]})
df2 = pd.DataFrame({'date_from':['2018-01-01', '2018-01-02', '2018-01-03', '2018-01-04','2018-01-05'],
                   'date_to':['2018-01-01 02:21:00', '2018-01-02 01:43:00', np.nan,
                              '2018-01-04 03:11:00', '2018-01-05 00:19:00']})

## converting to datetime
df1['date'] = pd.to_datetime(df1['date'])
df1.set_index('date', inplace=True)
df2['date_from'] = pd.to_datetime(df2['date_from'])
df2['date_to'] = pd.to_datetime(df2['date_to'])

def func(val):
    minimum_val = np.nan
    minimum_date = np.nan
    if val['date_from'] is pd.NaT or val['date_to'] is pd.NaT:
        pass
    minimum_val = df1[val['date_from'] : val['date_to']]['Open'].min()
    if  minimum_val is not np.nan:
        minimum_date = df1[val['date_from'] : val['date_to']].reset_index().head(1)['date'].values[0]
        pass
    else:
        pass
    return pd.DataFrame({'date_from':[val['date_from']], 'date_to':[val['date_to']], 'Open': [minimum_val], 'min_date': [minimum_date]})

df3=pd.concat(list(df2.apply(func, axis=1)))
0 голосов
/ 11 октября 2019

Следующий кодовый разрыв доступен для чтения.

import pandas as pd

def get_minimum_value(row, df):
    temp = df[(df['date'] >= row['date_from']) & (df['date'] <= row['date_to'])]
    return temp['value'].min()

df1 = pd.read_csv("test.csv")
df2 = pd.read_csv("test2.csv")

df1['date'] = pd.to_datetime(df1['date'])
df2['date_from'] = pd.to_datetime(df2['date_from'])
df2['date_to'] = pd.to_datetime(df2['date_to'])
df2['value'] = df2.apply(func=get_minimum_value, df=df1, axis=1)

Здесь функция df2.apply() отправляет каждую строку в качестве первого аргумента функции get_minimum_value. Применение этого к вашим данным, результат:

   date_from             date_to   value
0 2018-01-01 2018-01-01 02:21:00  1.0512
1 2018-01-02 2018-01-02 01:43:00     NaN
2 2018-01-03                 NaT     NaN
3 2018-01-04 2018-01-04 03:11:00     NaN
4 2018-01-05 2018-01-05 00:19:00     NaN
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...