【问题标题】:How to create a new column in multiindex dataframe which is in the format of datetime, using a reference date如何使用参考日期在日期时间格式的多索引数据框中创建一个新列
【发布时间】:2020-04-10 12:54:27
【问题描述】:

如何在多索引数据框中创建一个新列,其中每行中的日期表示从参考时间开始的日期。例如。

参考时间是每天上午 10:30

delta_minutes 列表示距离参考时间还有多少时间? 例如。日期 2019-12-2 的 delta_mins=20 的行表示该特定行的实际时间是 2019-12-2 上午 10:10,比参考时间晚 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

【问题讨论】:

  • 这不就是一个差和一个和吗?
  • 但它在多索引 df 中,我无法理解如何使用多索引
  • df1 是 groupby() 函数的结果吗?
  • 是的@davidbilla
  • @VishalAnand 我陷入了其他一些事情,请参阅下面的答案。希望这可以帮助。如果我错过了什么,请告诉我

标签: python pandas dataframe datetime multi-index


【解决方案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'] 的数据类型为datetime64,则在连接之前将其转换为字符串

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() 将日期列扩展到所有行,然后应用“实际时间”的操作

【讨论】:

    猜你喜欢
    • 2019-03-16
    • 2016-12-04
    • 1970-01-01
    • 2020-06-04
    • 2022-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    相关资源
    最近更新 更多