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