Python 创建一个新列";“一周”;从现有的日期列

Python 创建一个新列";“一周”;从现有的日期列,python,pandas,datetime,Python,Pandas,Datetime,我有一个数据集,它有一个连续格式的列日期。我想给它添加一个新的列,从Date列中的值中减去week A B 1 20050121 2 20050111 3 20050205 4 20050101 在这里,B列表示年|月|日格式的日期,我想在此数据集中添加一个新列,它从数据集中获取月日期,并告诉我们它属于哪一周,如下所示: A B C 1 20050121 3 2 20050111 2 3 20050205

我有一个数据集,它有一个连续格式的列日期。我想给它添加一个新的列,从Date列中的值中减去week

A    B
1    20050121
2    20050111
3    20050205
4    20050101

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

A    B           C
1    20050121    3
2    20050111    2
3    20050205    5
4    20050101    1
本周从2005年1月1日开始。我想把moth和date的值分开,然后根据这两个值进行计算,我该怎么做呢

您似乎需要:

如果需要
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
如果在第一周使用“获得更多”作为
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

总的来说,这是可行的,但这里有一些关于年初的困惑

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
为了避免这种情况,有些人建议采用这种特别的方式:

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

“它从数据集中获取月份日期并告诉我们它属于哪一周”这很奇怪。你的意思是从本月的哪一周开始,或者你想用月和日来确定一周?用月和日来确定哪一周不好,你建议的strftime真的很省时@耶斯雷利写这封信是因为我的答案似乎先被接受了,然后又被接受了——所以你可能想接受这两个答案。但在这样的情况下,这是不可能的,只有一个是可以接受的。这取决于你;)
A   B   C
0   1   20050121    3
1   2   20050111    2
2   3   20050205    5
3   4   20050101    1