【问题标题】:Pandas give dates ordinal weekly value熊猫给日期序数周值
【发布时间】:2021-07-18 22:25:45
【问题描述】:

我有类似这样的数据框:

dates=['2017-12-01','2017-12-05','2017-12-17','2017-12-28','2018-01-05','2018-01-09']
val=[5,2,3,6,1,7]
df = pd.DataFrame(list(zip(dates, val)),
               columns =['date', 'val'])
df

    date    val
0   2017-12-01  5
1   2017-12-05  2
2   2017-12-17  3
3   2017-12-28  6
4   2018-01-05  1
5   2018-01-09  7

我想创建一个新列,该列将为每个日期提供两个日期之间的周数。 例如,假设我定义的时间段介于 01/12/2017-01/07/2018 之间,
我将给出每个日期值,即从 01/12 开始的周数。 结果将是这样的:


    date        val    week_num
0   2017-12-01  5       1
1   2017-12-05  2       1
2   2017-12-17  3       3
3   2017-12-28  6       4
4   2018-01-05  1       6
5   2018-01-09  7       6 

所以我的问题是如何为两个时期之间的每个日期提供“计数周”值?

【问题讨论】:

    标签: python pandas date datetime


    【解决方案1】:

    我们可以从定义周期的开始即01/12/2017中减去date列中的时间戳来计算经过的天数,然后我们可以计算经过的天数相对于7的整数除法得到经过的天数周。

    df['date'] = pd.to_datetime(df['date'])
    
    days = df['date'] - pd.to_datetime('01/12/2017', dayfirst=True)
    df['week_num'] = (days.dt.days // 7) + 1
    

            date  val  week_num
    0 2017-12-01    5         1
    1 2017-12-05    2         1
    2 2017-12-17    3         3
    3 2017-12-28    6         4
    4 2018-01-05    1         6
    5 2018-01-09    7         6
    

    【讨论】:

      【解决方案2】:

      您首先必须将日期作为字符串转换为日期类型。在这里,我使用了一个 for 循环来计算第一个日期和下一个日期之间的天数差异。增量存储在列表中并添加到数据框中。

      from datetime import datetime
      d = []
      df['date'] = pd.to_datetime(df['date'])
      for i in df['date']:
        a = i-df['date'][0]
        d.append(int(a.days//7)+1)
      df['delta']=d
      df
      

      输出:

              date        val    delta   
      0       2017-12-01  5      1   
      1       2017-12-05  2      1   
      2       2017-12-17  3      3   
      3       2017-12-28  6      4   
      4       2018-01-05  1      6
      5       2018-01-09  7      6
      

      【讨论】:

        【解决方案3】:

        代码

        df['date'] = pd.to_datetime(df['date'])
        df['week_num'] = 1+(df['date']-df.loc[0,'date']).dt.days // 7
        

        输出

              date     val week_num
        0   2017-12-01  5   1
        1   2017-12-05  2   1
        2   2017-12-17  3   3
        3   2017-12-28  6   4
        4   2018-01-05  1   6
        5   2018-01-09  7   6
        

        说明

        我们从返回 TimeDelta 对象的每个日期元素中减去日期的第一个元素。
        然后,我们使用 dt 访问器从 TimeDelta 对象中获取天数整数。
        然后将天除以 7 得到周数,最后将周数加 1 以获得所需的输出。

        【讨论】:

          【解决方案4】:

          到处都是很好的答案,只是为了使用numpy timedelta 添加另一种方法:

          import numpy as np
          import datetime
          start = datetime.datetime(year=2017, month=12, day=1)
          df['week_num'] = (pd.to_datetime(df['date']) - start) // np.timedelta64(1,'W') + 1
          
              date    val     week_num
          0   2017-12-01  5   1
          1   2017-12-05  2   1
          2   2017-12-17  3   3
          3   2017-12-28  6   4
          4   2018-01-05  1   6
          5   2018-01-09  7   6
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-09-19
            • 2018-08-09
            • 1970-01-01
            • 2018-07-24
            • 2021-10-21
            • 2015-10-07
            • 2017-05-28
            • 2017-06-05
            相关资源
            最近更新 更多