尝试编写几行代码来创建主日期查找表

时间:2018-12-09 23:22:06

标签: python pandas datetime

希望,晚上这个问题比我今年早些时候提出的第一个-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合并到我的报告中。

1 个答案:

答案 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