我有类似的数据框:
dates=['2017-12-01','2017-12-05','2017-12-17','2017-12-28','2018-01-05','2018-01-09']
val=[5,2,3,6,1,7]
df = pd.DataFrame(list(zip(dates, val)),
columns =['date', 'val'])
df
date val
0 2017-12-01 5
1 2017-12-05 2
2 2017-12-17 3
3 2017-12-28 6
4 2018-01-05 1
5 2018-01-09 7
我想创建一个新列,为每个日期提供两个日期之间的周数。
例如,假设我定义的时间段介于 01/12/2017-01/07/2018 之间,
我将给出每个日期值,即从 01/12 开始的周数。
结果是这样的:
date val week_num
0 2017-12-01 5 1
1 2017-12-05 2 1
2 2017-12-17 3 3
3 2017-12-28 6 4
4 2018-01-05 1 6
5 2018-01-09 7 6
所以我的问题是如何为两个时期之间的每个日期提供“周数”值?
答案 0 :(得分:1)
我们可以从定义的周期开始减去date
列中的时间戳,即01/12/2017
来计算经过的天数,然后我们可以计算经过的天数相对于{{1的整数除法}} 获取经过的周数。
7
df['date'] = pd.to_datetime(df['date'])
days = df['date'] - pd.to_datetime('01/12/2017', dayfirst=True)
df['week_num'] = (days.dt.days // 7) + 1
答案 1 :(得分:1)
代码
df['date'] = pd.to_datetime(df['date'])
df['week_num'] = 1+(df['date']-df.loc[0,'date']).dt.days // 7
输出
date val week_num
0 2017-12-01 5 1
1 2017-12-05 2 1
2 2017-12-17 3 3
3 2017-12-28 6 4
4 2018-01-05 1 6
5 2018-01-09 7 6
说明
我们从返回 TimeDelta 对象的每个日期元素中减去日期的第一个元素。
然后我们使用 dt 访问器从 TimeDelta 对象中获取天数整数。
然后将天数除以 7 得到周数,最后将周数加 1 以获得所需的输出。
答案 2 :(得分:1)
您首先必须将日期作为字符串转换为日期类型。在这里,我使用了一个 for 循环来计算第一个日期和下一个日期之间的天数差异。增量存储在列表中并添加到数据框中。
from datetime import datetime
d = []
df['date'] = pd.to_datetime(df['date'])
for i in df['date']:
a = i-df['date'][0]
d.append(int(a.days//7)+1)
df['delta']=d
df
输出:
date val delta
0 2017-12-01 5 1
1 2017-12-05 2 1
2 2017-12-17 3 3
3 2017-12-28 6 4
4 2018-01-05 1 6
5 2018-01-09 7 6
答案 3 :(得分:1)
到处都是很好的答案,只是使用 numpy
timedelta 添加另一种方法:
import numpy as np
import datetime
start = datetime.datetime(year=2017, month=12, day=1)
df['week_num'] = (pd.to_datetime(df['date']) - start) // np.timedelta64(1,'W') + 1
date val week_num
0 2017-12-01 5 1
1 2017-12-05 2 1
2 2017-12-17 3 3
3 2017-12-28 6 4
4 2018-01-05 1 6
5 2018-01-09 7 6