第一个结果是数据集,第二个结果是我想要的:
“第几周”是表示这一年的第几周。只有一年的数据,这个第几周是没问题的,但遇到跨年,累计的第几周就会有问题了。
目前我的处理代码是:
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来计算累计的第几周。这样就可以正确处理跨年的情况。
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)
data=df.groupby([df['日期'],df['考试科目']]).agg('mean')