如何使用熊猫在年份变化时继续周数
Posted
技术标签:
【中文标题】如何使用熊猫在年份变化时继续周数【英文标题】:How to continue the week number when the year changes using pandas 【发布时间】:2020-04-12 23:06:45 【问题描述】:示例:通过使用
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 年 5 月 1 日至 2020 年 11 月 1 日的一周为 53。这需要继续。
【问题讨论】:
你能举个例子系列吗?pd.to_datetime(pd.Series(['2019-12-29'])).dt.strftime('%U')
为我返回 52
而不是 53
。如果您能提供代码来重现您的示例,那将非常有帮助。
无论如何,你的假设是错误的。 29/12/2019 是第 52 周,01/01/2020 是第 1 周。2019 年没有第 54 周和第 53 周……你想做什么?
2019 年第 53 周的解决方案你得到了吗?
@Jean-BaptisteYunès 2019 年是第 53 周,取决于您使用的是哪个“约定”。29,30,31 是第 53 周,第 1 周从 1 月 1 日开始
【参考方案1】:
如converting a pandas date to week number 中所述,您可以使用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')
【讨论】:
这只会给我一个特定的年份,但即使年份发生变化,我也需要继续周数。【参考方案2】:您可以使用isoweek
和isoyear
执行此操作。
我不知道您是如何得出您使用'%U'
呈现的值的,所以我假设您想将从周日开始的一周2019-12-29
以2020-01-04
结束映射到53
,并且您想要映射接下来的一周到54
等等。
在过去的几周内,您需要 isoweek
。isocalendar()
在第二个元素中提供一个带有 isoweek 的元组,在第一个元素中提供一个相应的唯一 isoyear。
但是等周从星期一开始,所以我们必须添加一天,以便将星期日解释为星期一并计入正确的一周。
减去 2019 得到从 0 开始的年份,然后每年乘以 53 并加上等周。最后,偏移量为 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 years
都有 53 周,但事实并非如此,因此您需要计算自 2019 年以来每个 iso 年的 iso 周数并将它们相加。
【讨论】:
【参考方案3】:也许你正在寻找这个。我修复了一个时代。如果您的日期早于 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
【讨论】:
以上是关于如何使用熊猫在年份变化时继续周数的主要内容,如果未能解决你的问题,请参考以下文章
python - 如何将带有年份的周数转换为python pandas中的日期时间格式?