希望,晚上这个问题比我今年早些时候提出的第一个-7问题要好! (我对此非常感激,因为这有助于突出我的无知)
我要实现的目标是编写一个狡猾的代码行,我可以在工作的任何数据帧中调用它们,以获取正确的星期数或星期几。
现在,请考虑以下数据框:
import pandas as pd
import numpy as np
days = pd.date_range('01/01/2018', '01/04/2019', freq='D')
df = pd.DataFrame({'Date': days})
print(df.head(5))
Date
0 2018-01-01
1 2018-01-02
2 2018-01-03
3 2018-01-04
4 2018-01-05
现在,我想通过使用以下代码行来创建公司周数:
请注意,我的公司使用财务日历,因此4月是第1周,而第1天是周六(您之中的精明人士可能已经知道我的问题了)!因此对于2018年,31/03/18实际上是我的2019年第1天第1财年,因为它是一个星期六,所以我们最多只能有53个星期。
df['Week'] = np.where(df['Date'].dt.month >= 4, (df['Date'] + pd.Timedelta(days=2)).dt.week - 13,
(df['Date'] + pd.Timedelta(days=2)).dt.week + 39)
print(df)
Date Week
0 2018-01-31 44
1 2018-02-01 44
2 2018-02-02 44
到目前为止一切都好吗?
所以让我们检查一下十二月
dec = df.Date.dt.month == 12
print(df.loc[dec].tail(5))
Date Week
330 2018-12-27 39
331 2018-12-28 39
332 2018-12-29 -12
333 2018-12-30 -12
334 2018-12-31 -12
如果我理解这是问题,则是pd.Timedelta试图正确放置我的星期数,但是由于我的初始公式为month >= 4
,它被放置为-12
此外,3月31日应该在第1周而不是第53周,因为它是星期六。
假设这是许多人可能已经完成的非常常见的任务,是否有人能以Python的方式来处理此问题?
我自己的解决方案是手动创建数据框并手动修复Week,Day和Fisical Year,放置在noSQL或SQL dB中,并在每个dF中调用它,然后将Week Number合并到我的报告中。
答案 0 :(得分:3)
IIUC,请使用fiscalyear
作为您范围的输入;
from fiscalyear import *
a = fiscalyear.FiscalYear(2018)
fiscalyear.START_MONTH = 4
days = pd.date_range(a.start, a.end, freq='D')
df = pd.DataFrame({'Date': days})
然后使用您编写的代码分配周数;
df['Week'] = np.where(df['Date'].dt.month >= 4, (df['Date'] + pd.Timedelta(days=2)).dt.week - 13,
(df['Date'] + pd.Timedelta(days=2)).dt.week + 39)
我唯一能想到的就是在12月底更改那三天的值;
df['Week'] = np.where(df['Week'] <= 0, 40, df['Week'])
print(df.iloc[270:280])
Date Week
270 2018-12-27 39
271 2018-12-28 39
272 2018-12-29 40
273 2018-12-30 40
274 2018-12-31 40
275 2019-01-01 40
276 2019-01-02 40
277 2019-01-03 40
278 2019-01-04 40
279 2019-01-05 41
注意;关于3月30日和3月31日的星期数,我会这样做:
df['Week'] = np.where(df['Week'] > 52, 1, df['Week'])
print(df.iloc[358:365])
Date Week
358 2019-03-25 52
359 2019-03-26 52
360 2019-03-27 52
361 2019-03-28 52
362 2019-03-29 52
363 2019-03-30 1
364 2019-03-31 1