Панды - Найти значение в другом столбце на основе максимальной отметки времени, предоставленной только датой - PullRequest
0 голосов
/ 21 октября 2018

Как получить v2 для любой заданной даты (макс. Отметка времени).поэтому предположим, что у меня есть только дата, известная как 2017-04-03, тогда как найти v2 с максимальной отметкой времени на дату 2017-04-03 (2017-04-03 16:30:00).Я знаю о df.loc

                       v1    v2
2017-04-03 09:15:00  35.7  35.4
2017-04-03 16:30:00  82.7  82.6
2017-04-04 09:15:00  24.3  24.2
2017-04-04 16:30:00  70.2  70.6
2017-04-28 09:15:00  31.7  31.4
2017-04-28 16:30:00  33.0  33.7

Ответы [ 4 ]

0 голосов
/ 21 октября 2018

Похоже, у вас есть индекс datetime.Вы можете отсортировать и получить последний.

df.sort_index().groupby(df.index.date).last()

Если индекс не дата и время, используйте

df.index = pd.to_datetime(df.index)

Вы получите

2017-04-03    82.6
2017-04-04    70.6
2017-04-28    33.7
0 голосов
/ 21 октября 2018

Мы можем получить индекс с помощью df.index и отфильтровать его с помощью:

from datetime import date

df.index.date == date(2017, 4, 3)

, который возвращает список логических значений:

>>> df.index.date == date(2017, 4,3)
array([ True,  True, False, False, False, False])

Далее мы можем получить максимальную метку времениэти индексы с:

>>> df.index[df.index.date == date(2017, 4,3)].max()
Timestamp('2017-04-03 16:30:00')

Таким образом, мы можем использовать df.loc[..], чтобы получить соответствующую запись с:

>>> df.loc[df.index[df.index.date == date(2017, 4,3)].max()]
v1    82.7
v2    82.6
Name: 2017-04-03 16:30:00, dtype: float64

или соответствующее значение для v2 с:

>>> df.loc[df.index[df.index.date == date(2017, 4,3)].max()].v2
82.6
0 голосов
/ 21 октября 2018

Преобразуйте ваш индекс в объект даты и времени, если вы еще этого не сделали, и затем получите максимальное значение

# Convert your index to datetime object
df.index = pd.to_datetime(df.index)

Затем

df.loc['2017-04-03'].v2.max()
82.6

или вы можете попробовать

df.groupby(df.index.date).v2.max()

2017-04-03    82.6
2017-04-04    70.6
2017-04-28    33.7
Name: v2, dtype: float64

или более сложный

df.groupby(df.index.date).apply(lambda x: pd.Series([x.v2.max(), x.v2.idxmax()]))
# Output
             0              1
2017-04-03  82.6    2017-04-03 16:30:00
2017-04-04  70.6    2017-04-04 16:30:00
2017-04-28  33.7    2017-04-28 16:30:00
0 голосов
/ 21 октября 2018

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

df.newDate = df.apply(lambda x: x[0].split(' ')[0]) # create date column that contains only the date
df.DateTime = pd.to_datetime(df[0]) # create datetime object column
result = df.groupby('newDate').apply(lambda df: df.sort_values('DateTime').iloc[-1])
# Sorts each unique date by time.

Ваш результат будет содержать только самые последние значения для каждого дня

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