【问题标题】:converting a pandas date to week number将熊猫日期转换为周数
【发布时间】:2015-09-19 18:56:52
【问题描述】:

我想从 pandas 数据框中的数据中提取周数。

日期格式为 datetime64[ns]

我已将日期标准化以从中删除时间

df['Date'] = df['Date'].apply(pd.datetools.normalize_date)

所以日期现在看起来像 - 2015-06-17 在数据框列中

现在我想将其转换为周数。

提前致谢

【问题讨论】:

    标签: python-3.x pandas datetime


    【解决方案1】:

    只需访问dt week 属性:

    In [286]:
    df['Date'].dt.week
    
    Out[286]:
    0    25
    dtype: int64
    
    In [287]:
    df['Week_Number'] = df['Date'].dt.week
    df
    
    Out[287]:
            Date  Week_Number
    0 2015-06-17           25
    

    【讨论】:

    • 请注意,Timestamp 对象的 week 属性是一年中的 ISO (8601) 周:github.com/pandas-dev/pandas/blob/…
    • 现在这个解决方案提出:FutureWarning: Series.dt.weekofyear 和 Series.dt.week 已被弃用。请改用 Series.dt.isocalendar().week。
    【解决方案2】:

    这是使用strftime 的另一种可能性。 strftime.org 是一个很好的资源。

    df['Week_Number'] = df['Date'].dt.strftime('%U')
    

    '%U' 将一年中的第几周(星期日作为一周的第一天)表示为一个零填充的十进制数字。新年中第一个星期日之前的所有日子都被认为是在第 0 周。

    如果您有多年的日期,我建议创建年-周组合

    df['Year-Week'] = df['Date'].dt.strftime('%Y-%U')
    

    【讨论】:

    • 对我来说最好的解决方案,从现在开始,公认的解决方案提出了:FutureWarning: Series.dt.weekofyear 和 Series.dt.week 已被弃用。请改用 Series.dt.isocalendar().week。
    【解决方案3】:

    Pandas 有其.dayofyear.weekofyear 功能,可以直接应用于pandas.to_datetime(df['column_name']) 的输出,将类型“Timestamp”作为输出。

    import pandas as pd
    df['formatted_date'] = pd.to_datetime(df['datetime'])
    df['day_of_year'] = df.formatted_date.apply(lambda x: x.dayofyear)
    df['week_of_year'] = df.formatted_date.apply(lambda x: x.weekofyear)
    

    【讨论】:

      【解决方案4】:
      from datetime import date
      df_date = pd.DataFrame([date.today()],columns  = ['today'])
      print(df_date)
      #### Print Output ####
      #        today
      #0  2019-09-07
      df_date['weeknum'] = df_date.today.apply(lambda x:x.isocalendar()[1])
      print(df_date)
      #### Print Output ####
      #        today  weeknum
      #0  2019-09-07       36
      

      【讨论】:

      • 要改进此答案,请考虑添加一些文本来支持解决问题的方式。
      【解决方案5】:

      更新此答案
      在我当前的 python 版本中(3.7,2021 年 5 月)。语法 df['Date'].dt.week 正在打印以下警告:FutureWarning: weekofyear and week have been deprecated, please use DatetimeIndex.isocalendar().week instead 使用 DatetimeIndex 的方法是:df['week_number'] = pd.DatetimeIndex(df.index).isocalendar().week
      这里有一个关于它用于返回系列的小演示

      # Input
      time_idx = pd.date_range('2022-01-01', periods=4, freq='H').tz_localize('UTC')
      values = [9 , 8, 7, 6]
      
      df1 = pd.DataFrame(data = values, index=time_idx, columns=['vals'])
      # FutureWarning: weekofyear and week have been deprecated
      df1['week_number'] = df1.index.week 
      
      # Using DatetimeIndex.isocalendar().week instead
      df2 = pd.DataFrame(data = values, index=time_idx, columns=['vals']) 
      # Does not throws a warning
      df2['week_number'] = pd.DatetimeIndex(df2.index).isocalendar().week 
      
      print(df2)
      

      【讨论】:

        【解决方案6】:

        如果是熊猫

        import random
        import pandas as pd
        
        desired_length = 100
        desired_frequency="20D" # XXXM: XXX months, "XXXD":XXX days, XXXMin: XXX minutes etc.
        
        index = pd.date_range('2020-01-01', periods=desired_length, freq=desired_frequency)
        data = [random.random() for _ in range(len(index))]
        
        df = pd.DataFrame(data=data, index=index, columns=['DATA'])
        df[df.index.isocalendar().keys()] = df.index.isocalendar()
        

        【讨论】:

          猜你喜欢
          • 2018-08-09
          • 2017-06-05
          • 2017-03-05
          • 2021-09-16
          • 2018-12-08
          • 2019-10-10
          • 1970-01-01
          相关资源
          最近更新 更多