在 pandas 中创建公司周数和年份

Dat*_*ice 1 python pandas

假设我们有以下 df

import pandas as pd

data = {'Dates' : ['2018-10-15', '2018-02-01', '2018-04-01']}
data['Dates'] = pd.to_datetime(data.Dates)

print(df)
    Dates
0   2018-10-15
1   2018-02-01
2   2018-04-01
Run Code Online (Sandbox Code Playgroud)

在我现在的公司,我们有一个财务周结构,我通常使用 Excel 来计算,我想用 Python 来实现

我使用 DateTime 模块来解决我的条件,如下所示

如果月份是>= 4(四月),则周数为 1(因此我采用 ISO 周数并减去 13)

如果月份是< 4我添加 39。

我对 YEAR 使用相同的逻辑 if >= 4 then Year + 1 else YEAR

我想我可以使用一个简单的 for 循环,我可以在我的数据帧上使用它

for x in data.Dates:
    if x.dt.month >= 4:
       df['Week'] = x.dt.week - 13
    else:
        df['Week'] = x.dt.week + 39
Run Code Online (Sandbox Code Playgroud)

以及今年

for x in data.Dates:
    if x.dt.month >= 4:
       df['Year'] = FY & x.dt.year + 1
    else:
         df['Year'] = FY & x.dt.year
Run Code Online (Sandbox Code Playgroud)

但是,>= 4两者都会引发公式错误。

File "<ipython-input-38-eadb99fdd9db>", line 4 df.Dates.dt.month > 4: ^ SyntaxError: invalid syntax

但是,如果我这样做

data['Week'] = data.Dates.dt.week

这给出了所有周数,我是否在这里遗漏了一些基本或必需的东西?

我希望这是清晰和简洁的,任何建议(甚至如何提出更好的问题)都会受到赞赏。

jpp*_*jpp 5

不要使用显式循环

Pandas 专注于矢量化操作。不需要循环for。例如,您可以使用numpy.where有条件地创建一个系列:

import numpy as np

data['Week'] = np.where(data['Dates'].dt.month >= 4, data['Dates'].dt.week - 13,
                        data['Dates'].dt.week + 39)
Run Code Online (Sandbox Code Playgroud)

您的代码不起作用的原因是您在每个循环中更新整个系列而不是系列中的元素。换句话说,您正在将元素逻辑应用于一系列。