如何在 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
我尝试使用此 解决方案,但它不起作用。
如何找到每天的 First
和 Last Value
(按日期分组)?
您可以将“日期”列值转换为日期(不含小时);然后 groupby
它并使用 first
和 last
得到想要的结果:
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_datetime
和 dt.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
我有一个 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 |
我尝试使用此 First
和 Last Value
(按日期分组)?
您可以将“日期”列值转换为日期(不含小时);然后 groupby
它并使用 first
和 last
得到想要的结果:
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_datetime
和 dt.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