如何在 pandas 数据框中找到每天的第一个和最后一个值

How do I find first and last value of each day in pandas dataframe

我有一个 pandas DataFrame,如下所示:

Price Date
25149.570 2/5/2017 14:22
24799.680 2/5/2017 14:22
24799.680 2/5/2017 14:22
14570.000 2/5/2017 14:47
14570.001 2/5/2017 14:47
14570.001 2/5/2017 14:47
14570.000 2/5/2017 15:01
14570.001 2/5/2017 15:01
14570.001 2/5/2017 15:01
14600.000 2/6/2017 17:49
14600.000 2/6/2017 17:49
14800.000 2/6/2017 17:49
14600.000 2/6/2017 17:49
14600.000 2/6/2017 17:49
14600.000 2/6/2017 18:30
14600.000 2/6/2017 18:30
14800.000 2/6/2017 18:30
14600.000 2/6/2017 18:30
14600.000 2/6/2017 18:30

我想根据日期列查找每一天的第一个和最后一个值。第一天的结果可能如下所示:

Date first last
2/5/2017 25149.57 14570.001

我尝试使用此 解决方案,但它不起作用。 如何找到每天的 FirstLast Value(按日期分组)?

您可以将“日期”列值转换为日期(不含小时);然后 groupby 它并使用 firstlast 得到想要的结果:

out = df.groupby(pd.to_datetime(df['Date']).dt.strftime('%m/%d/%Y'))['Price'].agg(['first', 'last']).reset_index()

输出:

         Date     first       last
0  02/05/2017  25149.57  14570.001
1  02/06/2017  14600.00  14600.000

您可以简单地使用:

df["Date"] = pd.to_datetime(df["Date"])
df.set_index("Date", inplace=True)
df.groupby(pd.Grouper(freq="D")).agg(["first", "last"])

输出

Date ('Price', 'first') ('Price', 'last')
2017-02-05 00:00:00 25149.6 14570
2017-02-06 00:00:00 14600 14600

您可以使用 pd.to_datetimedt.date as a grouper for GroupBy.agg:

df2 = (df.groupby(pd.to_datetime(df['Date']).dt.date)
         ['Price'].agg(['first', 'last'])
       )

输出:

               first       last
Date                           
2017-02-05  25149.57  14570.001
2017-02-06  14600.00  14600.000

您必须确保您的数据框按 Date 升序排序(也许 Price

df['Date'] = pd.to_datetime(df['Date'], dayfirst=False)
out = df.sort_values(['Date', 'Price']).groupby(df['Date'].dt.date)['Price'] \
        .agg(['first', 'last']).reset_index()
print(out)

# Output
         Date     first       last
0  2017-02-05  24799.68  14570.001
1  2017-02-06  14600.00  14800.000