我需要创建一列,每隔24小时,第一条日期记录应包含最大值public class FuturesFilesMapping : BaseTypeConfiguration<FuturesFilesModel>
{
public FuturesFilesMapping()
{
var counterparty = Map(i => i.Counterparty).Constant("counterparty");
Map(i => i.TradeDate).Name("Trade Date").Index(1).TypeConverterOption.Format("dd/MM/yyyy");
Map(i => i.BmfAccount).Name("A/C Ref").Index(2);
Map(i => i.Side).Name("B/S").Index(3);
Map(i => i.Quantity).Name("Lots").Index(4);
Map(i => i.Strike).Name("Strike").Index(5);
Map(i => i.Type).Name("Type").Index(6);
Map(i => i.Payout).Name("Call/Put").Index(7);
Map(i => i.Price).Name("Price").Index(8);
Map(i => i.Ticker).Name("Ric").Index(9);
Map(i => i.Broker).Name("Exec Firm Name").Index(10);
Map(i => i.Counterparty).Name("Contraparte").Index(11);
Map(i => i.Desk).Name("Mesa").Index(12);
Map(i => i.Exchange).Name("Exchange").Index(13);
Map(i => i.ArrivalDate, ).Name("delivery").Index(14).TypeConverterOption.Format(FormatDate(counterparty));
Map(i => i.Currency).Name("Curr").Index(15);
Map(i => i.ContractId).Name("Age").Index(16);
}
public static string FormatDate(string couterparty)
{
if (couterparty.Equals("FCM CITIGROUP GLOBAL MARKETS INC"))
{
return "MMM-yy";
}
else
{
return "dd MMM yyy";
}
}
}
。
因此,新列df.score
应该只包含一次daily_max_score
(在第一个每日记录中,通常在00:00:00,但并非总是在该小时和分钟)。 / p>
将熊猫作为pd导入
df.score.max()
所需的数据框:
df = pd.DataFrame({
'date': ['2019-04-19 23:00:00','2019-04-20 00:00:00','2019-04-20 01:00:00', '2019-04-05 08:00:00',
'2019-07-31 23:30:00','2019-08-01 00:00:00','2019-08-01 01:00:00', '2019-08-01 02:00:00'],
'ID': ['ID F', 'ID F', 'ID F', 'ID F',
'ID B', 'ID B', 'ID B', 'ID B'],
'score': ['50', '100', '99', '99',
'75', '25', '25', '80']})
df['date'] = pd.to_datetime(df['date'], infer_datetime_format=True)
df
date ID score
0 2019-04-19 23:00:00 ID F 50
1 2019-04-20 00:00:00 ID F 100
2 2019-04-20 01:00:00 ID F 99
3 2019-04-05 08:00:00 ID F 99
4 2019-07-31 23:30:00 ID B 75
5 2019-08-01 00:00:00 ID B 25
6 2019-08-01 01:00:00 ID B 25
7 2019-08-01 02:00:00 ID B 80
答案 0 :(得分:1)
首先,通过df['date'] = pd.to_datetime(df['date'])
将文本日期值转换为实际日期时间。
然后通过df.groupby(df['date'].dt.date)
分组日期。
获取每个日期的最高每日得分,首先将文本值转换为整数以获取最大值(与最大lex排序值相比)。将结果转换回字符串。
使用每个日期的最小日期时间的索引位置,即index=gb['date'].idxmin()
,创建每日最高分数的数据框。
现在可以将索引为daily_max_score
的此数据框连接到原始数据框(默认情况下在索引上连接),以产生所需的结果。
请注意,score
和daily_max_score
仍然是字符串(即对象),这是它们最初分配的方式,因此被推断为所需的类型。
df['date'] = pd.to_datetime(df['date'])
gb = df.groupby(df['date'].dt.date)
max_daily_scores = gb['score'].apply(lambda x: x.astype(int).max()).astype(str)
daily_max_score = pd.DataFrame(
max_daily_scores.tolist(),
index=gb['date'].idxmin(),
columns=['daily_max_score']
)
>>> df.join(daily_max_score)
date ID score daily_max_score
0 2019-04-19 23:00:00 ID F 50 50
1 2019-04-20 00:00:00 ID F 100 100
2 2019-04-20 01:00:00 ID F 99 NaN
3 2019-04-05 08:00:00 ID F 99 99
4 2019-07-31 23:30:00 ID B 75 75
5 2019-08-01 00:00:00 ID B 25 80
6 2019-08-01 01:00:00 ID B 25 NaN
7 2019-08-01 02:00:00 ID B 80 NaN