这听起来像是groupby/max 操作。更具体地说,您希望按Date 分组并通过采用max 聚合Times。由于聚合只能在 column 值上完成,我们需要将 Time 索引级别更改为列(通过使用 reset_index):
import pandas as pd
df = pd.DataFrame({'Date': ['2014-01-14', '2014-01-14', '2014-01-14', '2014-01-14', '2014-05-12', '2014-05-12'], 'Time': ['12:00:04', '12:01:12', '12:01:19', '12:05:49', '01:01:59', '01:02:42'], 'value': [0.42399999999999999, 0.34200000000000003, 0.34100000000000003, 0.23000000000000001, 0.0, 0.23000000000000001]})
df['Date'] = pd.to_datetime(df['Date'])
df = df.set_index(['Date', 'Time'])
df = df.reset_index('Time', drop=False)
max_times = df.groupby(level=0)['Time'].max()
print(max_times)
产量
Date
2014-01-14 12:05:49
2014-05-12 1:02:42
Name: Time, dtype: object
如果您希望选择整行,则可以使用idxmax——但有一点需要注意。 idxmax 返回索引标签。因此,索引必须是唯一,标签才能表示唯一的行。由于Date 级别本身并不是唯一的,要使用idxmax,我们需要完全使用reset_index(以创建唯一整数的索引):
df = pd.DataFrame({'Date': ['2014-01-14', '2014-01-14', '2014-01-14', '2014-01-14', '2014-05-12', '2014-05-12'], 'Time': ['12:00:04', '12:01:12', '12:01:19', '12:05:49', '01:01:59', '1:02:42'], 'value': [0.42399999999999999, 0.34200000000000003, 0.34100000000000003, 0.23000000000000001, 0.0, 0.23000000000000001]})
df['Date'] = pd.to_datetime(df['Date'])
df['Time'] = pd.to_timedelta(df['Time'])
df = df.set_index(['Date', 'Time'])
df = df.reset_index()
idx = df.groupby(['Date'])['Time'].idxmax()
print(df.loc[idx])
产量
Date Time value
3 2014-01-14 12:05:49 0.23
5 2014-05-12 01:02:42 0.23
在保留 MultiIndex 的同时,我没有看到这样做的好方法。
在设置 MultiIndex 之前执行groupby 操作更容易。
此外,最好将日期时间保留为一个值,而不是将其分成两部分。请注意,给定一个类似日期时间/周期的系列,.dt accessor 使您可以根据需要轻松访问date 和time。因此,您可以按Date 分组,而无需创建Date 列:
df = pd.DataFrame({'DateTime': ['2014-01-14 12:00:04', '2014-01-14 12:01:12', '2014-01-14 12:01:19', '2014-01-14 12:05:49', '2014-05-12 01:01:59', '2014-05-12 01:02:42'], 'value': [0.42399999999999999, 0.34200000000000003, 0.34100000000000003, 0.23000000000000001, 0.0, 0.23000000000000001]})
df['DateTime'] = pd.to_datetime(df['DateTime'])
# df = pd.read_csv('df.csv', parse_dates=[0])
idx = df.groupby(df['DateTime'].dt.date)['DateTime'].idxmax()
result = df.loc[idx]
print(result)
产量
DateTime value
3 2014-01-14 12:05:49 0.23
5 2014-05-12 01:02:42 0.23