【问题标题】:Creating a new Column "Week" from existing column of Date从现有的日期列创建一个新列“周”
【发布时间】:2018-02-11 18:10:40
【问题描述】:

我有一个数据集,它有一个连续格式的列日期。我想向它添加一个新列,从 Date 列中的该值中取出一周。

A    B
1    20050121
2    20050111
3    20050205
4    20050101

这里的 B 列以 YEAR|MONTH|DAY 格式表示日期,我想在这个数据集中添加一个新列,它从数据集中获取月份日期并告诉我们它属于哪一周,例如这个:

A    B           C
1    20050121    3
2    20050111    2
3    20050205    5
4    20050101    1

星期从2005年1月1日开始。我想把moth和date的值分开,然后根据这两个值计算,我该怎么做?

【问题讨论】:

  • “从数据集中获取月份日期并告诉我们它属于哪一周”这很奇怪。您的意思是本月从哪一周开始,或者您想使用月份和日期来确定星期?
  • 使用月份和日期确定哪一周
  • 不,没关系,你建议的strftime真的是节省时间! @jezrael
  • 我写它是因为似乎首先被接受了我的答案,然后是另一个 - 所以您可能希望同时接受这两个答案。但在 SO 中是不可能的,只能接受一个。这取决于你;)

标签: python pandas datetime


【解决方案1】:

看来你需要strftime by http://strftime.org/:

df['C'] = pd.to_datetime(df['B'], format='%Y%m%d').dt.strftime('%W')
print (df)
   A         B   C
0  1  20050121  03
1  2  20050111  02
2  3  20050205  05
3  4  20050101  00

如果需要ints:

df['C'] = pd.to_datetime(df['B'], format='%Y%m%d').dt.strftime('%W').astype(int)
print (df)
   A         B  C
0  1  20050121  3
1  2  20050111  2
2  3  20050205  5
3  4  20050101  0

如果使用weekofyear 第一周获得更多50

df['C'] = pd.to_datetime(df['B'], format='%Y%m%d').dt.weekofyear
print (df)
   A         B   C
0  1  20050121   3
1  2  20050111   2
2  3  20050205   5
3  4  20050101  53

但可以掩盖它:

dates = pd.to_datetime(df['B'], format='%Y%m%d')
m = (dates.dt.month == 1) & (dates.dt.weekofyear > 50)
df['C'] = np.where(m, 1, dates.dt.weekofyear)
print (df)
   A         B  C
0  1  20050121  3
1  2  20050111  2
2  3  20050205  5
3  4  20050101  1

【讨论】:

    【解决方案2】:

    一般来说,这会起作用,但这里有一些关于年初的困惑

    import datetime
    date_from_str = datetime.datetime.strptime
    
    df = pd.DataFrame([[1, 20050121],
                       [2, 20050111],
                       [3, 20050205],
                       [4, 20050101]], columns = ['A','B'])
    df['C']= df['B'].astype('str').apply(lambda date:     
    date_from_str(date,'%Y%m%d').isocalendar()[1])
    df
    

    输出是:

    A   B   C
    0   1   20050121    3
    1   2   20050111    2
    2   3   20050205    5
    3   4   20050101    53
    

    为了避免这种情况,来自here 的一些人建议这样做:

    def correct(date_):
        year, week = date_.year, date_.isocalendar()[1]
        ret = datetime.strptime('%04d-%02d-1' % (year, week), '%Y-%W-%w')
        if date(year, 1, 4).isoweekday() > 4:
            ret -= timedelta(days=7)
        return ret.isocalendar()[1]
    
    df['C']= df['B'].astype('str').apply(lambda date:  correct(date_from_str(date,'%Y%m%d')))
    

    然后,输出将是:

    A   B   C
    0   1   20050121    3
    1   2   20050111    2
    2   3   20050205    5
    3   4   20050101    1
    

    【讨论】:

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