Python 如何在年份发生变化时使用熊猫延续周数
示例:通过使用Python 如何在年份发生变化时使用熊猫延续周数,python,python-3.x,pandas,Python,Python 3.x,Pandas,示例:通过使用 df['Week_Number'] = df['Date'].dt.strftime('%U') for 29/12/2019 the week is 52. and this week is from 29/12/2019 to 04/01/2020. but for 01/01/2020 the week is getting as 00. 我需要2020年1月1日的一周时间,也可以是52。2020年1月5日至2020年1月11日为53。这需要继续。如中所述,您可以使用
df['Week_Number'] = df['Date'].dt.strftime('%U')
for 29/12/2019 the week is 52. and this week is from 29/12/2019 to 04/01/2020.
but for 01/01/2020 the week is getting as 00.
我需要2020年1月1日的一周时间,也可以是52。2020年1月5日至2020年1月11日为53。这需要继续。如中所述,您可以使用df['Date'].dt.week
获取周数
为了让它继续下去,你也许可以用新的周值来总结上周的数字,像这样?我现在不能测试这个
if(df['Date'].dt.strftime('%U') == 53):
last = df['Date'].dt.strftime('%U')
df['Week_Number'] = last + df['Date'].dt.strftime('%U')
您可以使用
isoweek
和isoyear
执行此操作。
我看不出您是如何得出用'%U'
表示的值的,因此我假设您希望将从周日开始的一周映射到2019-12-29
到2020-01-04
到53
,并且希望将下一周映射到54
,以此类推。
在过去的几周内,您需要isoweek
isocalendar()
在第二个元素中提供一个元组,其中isoweek位于第二个元素中,对应的唯一isoyear位于第一个元素中。
但是等周从周一开始,所以我们必须加上一天,所以周日被解释为周一,并计入正确的一周。
减去2019年,从0开始计算年份,然后每年乘以53,再加上isoweek。最后,偏移量为1,因此到达53
In [0]: s=pd.Series(["29/12/2019", "01/01/2020", "05/01/2020", "11/01/2020"])
dts = pd.to_datetime(s,infer_datetime_format=True)
In [0]: (dts + pd.DateOffset(days=1)).apply(lambda x: (x.isocalendar()[0] -2019)*53 + x.isocalendar()[1] -1)
Out[0]:
0 53
1 53
2 54
3 54
dtype: int64
当然,这是假设所有的iso年都有53周,但事实并非如此,因此您需要计算2019年以来每个iso年的iso周数,并将其相加。也许您正在寻找这一点。我确定了一个时代。如果日期早于2019年,则可以选择其他纪元
epoch= pd.Timestamp("2019-12-23")
# Test data:
df=pd.DataFrame({"Date":pd.date_range("22/12/2019",freq="1D",periods=25)})
df["Day_name"]=df.Date.dt.day_name()
# Calculation:
df["Week_Number"]=np.where(df.Date.astype("datetime64").le(epoch), \
df.Date.dt.week, \
df.Date.sub(epoch).dt.days//7+52)
df
Date Day_name Week_Number
0 2019-12-22 Sunday 51
1 2019-12-23 Monday 52
2 2019-12-24 Tuesday 52
3 2019-12-25 Wednesday 52
4 2019-12-26 Thursday 52
5 2019-12-27 Friday 52
6 2019-12-28 Saturday 52
7 2019-12-29 Sunday 52
8 2019-12-30 Monday 53
9 2019-12-31 Tuesday 53
10 2020-01-01 Wednesday 53
11 2020-01-02 Thursday 53
12 2020-01-03 Friday 53
13 2020-01-04 Saturday 53
14 2020-01-05 Sunday 53
15 2020-01-06 Monday 54
16 2020-01-07 Tuesday 54
17 2020-01-08 Wednesday 54
18 2020-01-09 Thursday 54
19 2020-01-10 Friday 54
20 2020-01-11 Saturday 54
21 2020-01-12 Sunday 54
22 2020-01-13 Monday 55
23 2020-01-14 Tuesday 55
24 2020-01-15 Wednesday 55
这只给出了特定年份的周数,但即使年份发生变化,我也需要延续周数。您能给出一个示例系列吗?
pd.to_datetime(pd.Series(['2019-12-29'])).dt.strftime('%U')
为我返回52
,而不是53
。如果你能提供代码来重现你的例子,那将非常有帮助。不管怎样,你的假设是错误的。2019年12月29日为第52周,2020年1月1日为第1周。2019年没有第54周和第53周。。。你想做什么?你得到2019年第53周的解决方案了吗?@Jean BaptisteYunès 2019年第53周,这取决于你使用的是哪种“惯例”。。29,30,31是第53周,第1周从1月1日开始