如何使用熊猫在年份变化时继续周数

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】:

您可以使用isoweekisoyear 执行此操作。 我不知道您是如何得出您使用'%U' 呈现的值的,所以我假设您想将从周日开始的一周2019-12-292020-01-04 结束映射到53,并且您想要映射接下来的一周到54等等。 在过去的几周内,您需要 isoweekisocalendar() 在第二个元素中提供一个带有 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中的日期时间格式?

如何在 R 中解析年 + 周数?

如何以年份为频率创建熊猫 DatetimeIndex?

使用给定的参考年份计算给定日期的周数

在一个 mysqli 查询中给出年份、周数和工作日时返回 DATE

如何在熊猫时间序列中获得一个月的所有行而不考虑年份?