问题描述
对于一个Dataframe
而言,有时候我们需要对列进行分组,并且在每个组的内部根据另一列的信息提取其他列内部的数据。比如股票价格的数据,一只股票在不同日期,每个日期的不同时间点都产生了不同的股票价格。我们如果想要得到每个日期的开盘价格、收盘价格,就需要对日期进行归类,获取时间最靠前的价格数据。
数据情况
这里我们使用一个人工产生的数据,这是Jeff Heaton教授网站的一个公开数据,通过下面的代码我们可以看到这个数据是每天不同时间点的股票数据。
import pandas as pd
df = pd.read_csv("https://data.heatonresearch.com/data/t81-558/datasets/series-31.csv")
display(df.head())
time | value | |
---|---|---|
0 | 08-22-2019 12:51 | 19.195359 |
1 | 09-19-2019 09:44 | 13.519543 |
2 | 08-26-2019 14:05 | 9.191413 |
3 | 08-19-2019 16:37 | 18.346598 |
4 | 09-05-2019 09:18 | 1.349778 |
目标
提取每一天的股票开盘价、收盘价,即对于每一天而言,时间点最小的那个对应的股票价格。
代码
def extract_date(time):
return pd.to_datetime(time[:time.find(' ')])
df['date'] = df['time'].map(extract_date) #把日期单独抽取出来,用于归类
df['time'] = pd.to_datetime(df['time'], errors='coerce') #转化为datetime类型,可以进行大小的比较
starting_time_idx = df.groupby(['date'])['time'].idxmin() #idxmin()给出组内部time最小的那行的行数
ending_time_idx = df.groupby(['date'])['time'].idxmax() #类似idxmin(), idxmax()给出time最大的行数
result_df = pd.DataFrame()
result_df['starting'] = df.loc[starting_time_idx]['value'].values
result_df['ending'] = df.loc[ending_time_idx]['value'].values