开发者社区> 问答> 正文

如何使用引用日期在多索引dataframe中创建一个datetime格式的新列

如何在多索引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

展开
收起
kun坤 2019-12-26 15:41:29 635 0
1 条回答
写回答
取消 提交回答
  • 您可以使用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'操作

    2019-12-26 15:41:37
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载