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

Uma*_*ain 6 python datetime pandas

希望,这个问题比我今年早些时候的第一个问题好得多了-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
Run Code Online (Sandbox Code Playgroud)

现在,我想使用以下代码行创建公司周数:

请注意我的公司使用金融日历,所以4月是第1周,但第1天是星期六(你们中间的精明人员可能已经知道我的问题了)!因此,对于2018年,31/03/18实际上是我的第1周第1周财政年度2019年周六,我们最多只有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
Run Code Online (Sandbox Code Playgroud)

到目前为止一切都好吗?

所以让我们检查12月

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
Run Code Online (Sandbox Code Playgroud)

问题,如果我理解这是pd.Timedelta试图正确放置我的周数,但由于我的初始公式,month >= 4它被放置为-12

此外,3月31日应该是第1周,而不是第53周,因为它是星期六.

假设这是许多人可能已经完成的非常常见的任务,那么是否有人有方法或方式以pythonic方式处理这个问题.

我自己的解决方案是手动创建一个数据帧并手动修复周,日和Fisical年,放入noSQL或SQL dB并在每个dF中调用它并将周数合并到我的报告中.

Zan*_*hin 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})
Run Code Online (Sandbox Code Playgroud)

然后使用您自己编写的代码来分配周数;

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)
Run Code Online (Sandbox Code Playgroud)

我能想到的唯一办法就是改变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
Run Code Online (Sandbox Code Playgroud)

笔记; 关于 3 月 30 日和 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
Run Code Online (Sandbox Code Playgroud)