оценка, находится ли функция даты и времени в каждой строке df в пределах диапазона времени и даты в другом df - PullRequest
3 голосов
/ 01 апреля 2019

Я новичок в python, и мне нужна помощь с вопросом, который у меня возникает по поводу функции даты и времени. У меня есть df_a, у которого есть столбец с названием «время», и я пытаюсь создать новый столбец «id» в этом df_a. Я хочу, чтобы столбец 'id' определялся по тому, содержится ли время в пределах диапазона времени в столбцах df_b между "date" и "date_new", например, в первой строке есть дата "2019-01-07 20:52:41 "и" date_new "из" 2019-01-07 21:07:41 "(15-минутный интервал времени), я хотел бы, чтобы индекс для этой строки отображался в качестве моего идентификатора в df_a, когда время "2019-01-07 20:56:30" (т.е. с id = 0) и так далее для всех строк в df_a,

Этот вопрос похож, но не могу понять, как заставить его работать с моим, так как я продолжаю получать

Python присваивает значение pandas df, если попадает в диапазон дат в другом df

s = pd.Series(df_b['id'].values,pd.IntervalIndex.from_arrays(df_b['date'],df_b['date_new'])) 
df_a['id']=df_a['time'].map(s)

ValueError: cannot handle non-unique indices

Одно предупреждение: диапазоны в df_b не всегда уникальны, что означает, что некоторые из интервалов содержат одинаковые периоды времени, в этих случаях хорошо, если он использует идентификатор первого периода времени в df_b, в который он попадает, Кроме того, в df_b содержится более 200 строк, а в df_a - 2000, поэтому определение каждого периода времени в формате типа цикла for займет много времени, если нет более простого способа сделать это, чем определить каждый, заранее благодарим за всю вашу помощь! если это может использовать какие-либо разъяснения, пожалуйста, сообщите мне!

df_a

time                    id
2019-01-07 22:02:56     NaN
2019-01-07 21:57:12     NaN
2019-01-08 09:35:30     NaN


df_b

date                    date_new               id
2019-01-07 21:50:56    2019-01-07 22:05:56     0
2019-01-08 09:30:30    2019-01-08 09:45:30     1

Expected Result

df_a     
time                    id
2019-01-07 22:02:56     0
2019-01-07 21:57:12     0
2019-01-08 09:35:30     1

Ответы [ 2 ]

2 голосов
/ 01 апреля 2019

Позвольте мне перефразировать вашу проблему.Для каждой строки в фрейме данных df_a вы хотите проверить, находится ли ее значение в df_a['time'] в интервале, заданном значениями в столбцах df_b['date'] и df_b['date_new'].Если это так, установите значение в df_a["id"] как в соответствующем df_b["id"].

Если это ваш вопрос, это (очень грубое) решение:

for ia, ra in df_a.iterrows():
    for ib, rb in df_b.iterrows():
        if (ra["time"]>=rb['date']) & (ra["time"]<=rb['date_new']):
            df_a.loc[ia, "id"] = rb["id"]
            break
1 голос
/ 02 апреля 2019

pandas не имеет большой поддержки неэквивалентных объединений, это то, что вы ищете, но у него есть функция merge_asof, которую вы, возможно, захотите проверить: http://pandas.pydata.org/pandas-docs/version/0.22/generated/pandas.merge_asof.html

Это должно значительно ускорить ваше присоединение.

Например:

df_a = pd.DataFrame({'time': ['2019-01-07 22:02:56', '2019-01-07 21:57:12', '2019-01-08 09:35:30']})
df_b = pd.DataFrame({'date': ['2019-01-07 21:50:56', '2019-01-08 09:30:30'], 'date_new': ['2019-01-07 22:05:56', '2019-01-08 09:45:30'], 'id':[0,1]})
df_a['time'] = pd.to_datetime(df_a['time'])
df_b['date'] = pd.to_datetime(df_b['date'])
df_b['date_new'] = pd.to_datetime(df_b['date_new'])

#you need to sort df_a first before using merge_asof
df_a.sort_values('time',inplace=True)
result = pd.merge_asof(df_a, df_b, left_on='time', right_on='date')

#get rid of rows where df_a.time values are greater than df_b's new date
result = result[result.date_new > result.time]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...