如何在多索引dataframe中创建一个新列,其中每行中的日期表示来自参考时间的日期。如。 面试时间是每天上午10:30。 delta_minutes列表示在引用时间之前的时间? 如。对于日期为2019-12-2的行,delta_mins=20意味着该特定行的实际时间是10:10am 2019-12-2,这比参考时间晚了20分钟 我想要添加另一列,它是一行实际时间的指示,这样我就可以在时间序列中对它进行建模 df1是实际的df,而我想要生成的新datframe看起来像df2 df1
date delta_mins sold_before
2019-12-2 20 a1
30 a2
40 a3
50 a4
60 a5
2019-12-3 20 d1
30 d2
40 d3
50 d4
60 d5
2019-12-4 20 g1
30 g2
40 g3
50 g4
60 g5
参考时间=上午10:30 df2
date delta_mins sold_before actual_time
2019-12 20 a1 2019-12-2 10:10
30 a2 2019-12-2 10:00
40 a3 2019-12-2 09:50
50 a4 2019-12-2 09:40
60 a5 2019-12-2 09:30
2019-12-3 20 d1 2019-12-3 10:10
30 d2 2019-12-3 10:00
40 d3 2019-12-3 09:50
50 d4 2019-12-3 09:40
60 d5 2019-12-3 09:30
2019-12-4 20 g1 2019-12-4 10:10
30 g2 2019-12-4 10:00
40 g3 2019-12-4 09:50
50 g4 2019-12-4 09:40
60 g5 2019-12-4 09:30
问题来源StackOverflow 地址:/questions/59384090/how-to-create-a-new-column-in-multiindex-dataframe-which-is-in-the-format-of-dat
您可以使用reset_index()并应用您的操作
df1 = df1.reset_index(drop=True)
df1['actual_time'] = pd.to_datetime(df1['date'] + ' 10:30:00') - df1['delta_mins'].apply(lambda x: pd.Timedelta(minutes=x))
如果df1['date']是dtype datetime64,那么在concate之前将其转换为字符串
df1['actual_time'] = pd.to_datetime(df1['date'].dt.strftime('%Y-%m-%d') + ' 10:30:00') - df1['delta_mins'].apply(lambda x: pd.Timedelta(minutes=x))
输出:
date delta_mins sold_before actual_time
0 2019-12-2 20 a1 2019-12-02 10:10:00
1 2019-12-2 30 a2 2019-12-02 10:00:00
2 2019-12-2 40 a3 2019-12-02 09:50:00
3 2019-12-2 50 a4 2019-12-02 09:40:00
4 2019-12-2 60 a5 2019-12-02 09:30:00
5 2019-12-3 20 d1 2019-12-03 10:10:00
6 2019-12-3 30 d2 2019-12-03 10:00:00
7 2019-12-3 40 d3 2019-12-03 09:50:00
8 2019-12-3 50 d4 2019-12-03 09:40:00
9 2019-12-3 60 d5 2019-12-03 09:30:00
10 2019-12-4 20 g1 2019-12-04 10:10:00
11 2019-12-4 30 g2 2019-12-04 10:00:00
12 2019-12-4 40 g3 2019-12-04 09:50:00
13 2019-12-4 50 g4 2019-12-04 09:40:00
14 2019-12-4 60 g5 2019-12-04 09:30:00
有了它之后,如果需要,可以使用df1.groupby()语句再次对数据进行分组。
df1 = df1.groupby(['date', 'delta_mins', 'sold_before']).agg(lambda x: x) # replace this with your groupby() statement
输出:
actual_time
date delta_mins sold_before
2019-12-2 20 a1 2019-12-02 10:10:00
30 a2 2019-12-02 10:00:00
40 a3 2019-12-02 09:50:00
50 a4 2019-12-02 09:40:00
60 a5 2019-12-02 09:30:00
2019-12-3 20 d1 2019-12-03 10:10:00
30 d2 2019-12-03 10:00:00
40 d3 2019-12-03 09:50:00
50 d4 2019-12-03 09:40:00
60 d5 2019-12-03 09:30:00
2019-12-4 20 g1 2019-12-04 10:10:00
30 g2 2019-12-04 10:00:00
40 g3 2019-12-04 09:50:00
50 g4 2019-12-04 09:40:00
60 g5 2019-12-04 09:30:00
或者: 您可以在groupby()语句中使用.transform()将日期列扩展到所有行,然后应用'actual_time'操作
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。