从现有的Date列创建新的“Week”列

时间:2017-09-03 07:31:00

标签: python pandas datetime

我有一个数据集,它具有连续格式的列日期。我想在其中添加一个新列,该列从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日开始。我想分别将蛾和日期的值分开,然后根据这两个值计算,我该怎么做?

2 个答案:

答案 0 :(得分:2)

strftime

似乎需要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

如果需要int s:

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

答案 1 :(得分:1)

一般情况下,这会有效,但这里有一些关于年初的混淆

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