pandas:如何计算各个日期累计的周次?

第一个结果是数据集,第二个结果是我想要的:

img

“第几周”是表示这一年的第几周。只有一年的数据,这个第几周是没问题的,但遇到跨年,累计的第几周就会有问题了。

目前我的处理代码是:

import copy
import pandas as pd

df1 = pd.DataFrame([
    ['2023-01-03', 1],
    ['2023-01-04', 1],
    ['2023-01-05', 1],
    ['2023-01-06', 1],
    ['2023-01-09', 2],
    ['2023-01-10', 2],
    ['2023-01-11', 2],
    ['2023-01-12', 2],
    ['2023-01-13', 2],
    ['2024-01-03', 1]
], columns=['日期', '第几周'])

print(df1)

df2 = copy.deepcopy(df1)
df2['pre_第几周'] = df2['第几周'].shift(1)
df2['累计第几周'] = 1
for index in df2.index:
    if index > 0:
        if df2.loc[index, '第几周'] != df2.loc[index, 'pre_第几周']:
            df2.loc[index, '累计第几周'] = df2.loc[index - 1, '累计第几周'] + 1
        else:
            df2.loc[index, '累计第几周'] = df2.loc[index - 1, '累计第几周']
df2 = df2.loc[:, ['日期', '第几周', '累计第几周']]
print(df2)

如何使用向量或其他办法优化计算呢?

该回答引用chatgpt:
将日期列转换为datetime类型,然后使用dt.days获取日期与最小日期之间的天数差。然后将天数差除以7,并加上1来计算累计的第几周。这样就可以正确处理跨年的情况。

img


import pandas as pd
from datetime import datetime

df1 = pd.DataFrame([
    ['2023-01-03', 1],
    ['2023-01-04', 1],
    ['2023-01-05', 1],
    ['2023-01-06', 1],
    ['2023-01-09', 2],
    ['2023-01-10', 2],
    ['2023-01-11', 2],
    ['2023-01-12', 2],
    ['2023-01-13', 2],
    ['2024-01-03', 1]
], columns=['日期', '第几周'])

df1['日期'] = pd.to_datetime(df1['日期'])
df1['累计第几周'] = (df1['日期'] - df1['日期'].min()).dt.days // 7 + 1

print(df1)