【问题标题】:Calculate days difference between every date column in Pandas dataframe at once一次计算 Pandas 数据框中每个日期列之间的天数差异
【发布时间】:2021-10-06 02:16:31
【问题描述】:

我在df 下方有一个示例数据框:

  Step 1 Step 2 Step 3 Step 4
0    1/1   2/13   3/23    4/7
1    1/6   2/27   3/26   4/11
2    1/9    3/2    4/1   4/18

我想一次性获取每个连续步骤之间的天数差异,并为每个差异创建一个新列,如下所示:

  Step 1 Step 2 Step 3 Step 4  diff_btwn_1_2  diff_btwn_2_3  diff_btwn_3_4
0    1/1   2/13   3/23    4/7             43             38             15
1    1/6   2/27   3/26   4/11             52             27             16
2    1/9    3/2    4/1   4/18             52             30             17

有没有办法在 Python 中有效地做到这一点?我在尝试遍历列并根据与步骤关联的整数值动态命名变量时遇到了一些复杂情况。

【问题讨论】:

    标签: python pandas date datetime for-loop


    【解决方案1】:

    转换您的日期to_datetime,这将给出一个几乎无用的年份值 1900(或者如果您知道它应该是什么,请指定您自己的年份)。然后,您可以使用diff 计算连续列之间的日期差异。最后将结果加入回来。

    为了保留您的初始格式化日期,我将使用具有 datetime 值的 DataFrame 副本。

    此外,由于您没有年份信息,因此您可能需要注意日期,具体取决于您是否认为它是闰年。

    import pandas as pd
    
    dfdates = df.apply(pd.to_datetime, format='%m/%d')
    
    # Get difference in days, drop first `NaN` diff. 
    diffs = dfdates.diff(axis=1).apply(lambda x: x.dt.days).iloc[:, 1:]
    # Rename columns
    diffs.columns = 'diff_' + dfdates.columns[:-1] + '-' + diffs.columns
    
    df = pd.concat([df, diffs], axis=1)
    

    print(df)
    
      Step 1 Step 2 Step 3 Step 4  diff_Step 1-Step 2  diff_Step 2-Step 3  diff_Step 3-Step 4
    0    1/1   2/13   3/23    4/7                  43                  38                  15
    1    1/6   2/27   3/26   4/11                  52                  27                  16
    2    1/9    3/2    4/1   4/18                  52                  30                  17
    

    【讨论】:

      【解决方案2】:

      我想出了一个解决办法。有几件事,首先我的数据最初确实有年份的日期。因此,在下面的解决方案中,您会看到我没有将字段更改为日期时间(不包括原始帖子中的年份以节省空间)。其次,我的原始数据集中有 NaT 值,ALollz 发布的解决方案导致了意外行为(但如果没有 NaT,则效果很好)。我无法从原始 process_df 中删除 NaT 值,因为在后面的步骤中几乎没有数据。

      def create_days_diff_dataframe(data):
          '''Creates days difference column for every sequential milestone
          and adds to new dataframe'''
          days_diff_df = pd.DataFrame()
          for i in range(len(data.columns[:-1])):
              days_diff_btwn_milestones = (data.iloc[:, i + 1] - data.iloc[:, i]).dt.days
              days_diff_df['days_diff_' + data.columns[i] + ' - ' + data.columns[i + 1]] = days_diff_btwn_milestones
          
          return days_diff_df
      
      days_diff_df = create_days_diff_dataframe(process_df)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-12-09
        • 1970-01-01
        • 2022-11-27
        • 2023-01-31
        • 2013-09-21
        • 2018-03-29
        • 2021-01-14
        • 1970-01-01
        相关资源
        最近更新 更多