我有一个数据框,其列名订单日期包含 2014 年 7 月至 2015 年 6 月的日期,格式为 2014-10-17 15:11:54。使用日期时间,我从日期中提取了周数。但是,我将 27 年 2014 月的起始周作为 2014 年 1 月的开始周,而不是 2015 年 1 月再次作为第 1 周开始。我想要的是 2014 年 7 月,因为第 1 周一直持续到 2015 年 6 月,并以 53 结束。
df['Week'] = df.order_date.dt.week
使用上面的代码获取之后的周数,以获得 1 用于 2014 年 7 月使用
def time_period(x):
if df.Week >= 26:
return df.Week -25
else:
return df.Week +28
df['week_serial'] = df.Week.apply(lambda x: time_period(x))
这给出了一个错误 - 序列的真值不明确。使用 a.empty、a.bool((、a.item((、a.any(( 或 a.all((。
由于df.Week
已经包含周数,因此该函数应如下所示:
def time_period(x):
ifx>= 26:
returnx-25
else:
returnx+28
但我认为你在这里基本上正在寻找一个模运算:
df['week_serial'] = (df['Week'] + 27)% 53+ 1
这将映射26
1
、27
2
等;25
映射53
和24
52
等。
因此,对于示例输入:
>>> df
Week
0 13
1 49
2 47
3 12
4 35
5 17
6 1
7 46
8 19
9 0
我们获得:
>>> (df['Week'] + 27) % 53 + 1
0 41
1 24
2 22
3 40
4 10
5 45
6 29
7 21
8 47
9 28
Name: Week, dtype: int64
鉴于您已经有datetime.datetime
对象,使用这些对象可能是最简单的。
首先,定义您的开始日期。
In [1]: import datetime
In [2]: start = datetime.datetime(2014, 7, 1)
Out[2]: datetime.datetime(2014, 7, 1, 0, 0)
然后确定每个日期和开始之间的timedelta
,并将其转换为天,然后是周。
In [3]: (datetime.datetime(2015, 3, 24) - start).days
Out[3]: 266
In [4]: (datetime.datetime(2015, 3, 24) - start).days // 7 + 1
Out[4]: 39