Python 创建一个新列";“一周”;从现有的日期列
我有一个数据集,它有一个连续格式的列日期。我想给它添加一个新的列,从Date列中的值中减去weekPython 创建一个新列";“一周”;从现有的日期列,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
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