假设我们有以下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


在我目前的公司中,我们有一个财务周结构,我通常使用excel进行工作,我想用Python做到这一点。

我使用DateTime模块来解决以下情况

如果月份是>= 4(四月),则周号为1(因此我将ISO周号减去13)

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

如果> = 4,然后年份+ 1,否则我对YEAR使用相同的逻辑,否则为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


而这一年

for x in data.Dates:
    if x.dt.month >= 4:
       df['Year'] = FY & x.dt.year + 1
    else:
         df['Year'] = FY & x.dt.year


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

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

但是,如果我这样做

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

这给出了所有星期的数字,我在这里缺少基本的或必不可少的东西吗?

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

最佳答案

不要使用显式循环

熊猫专门从事向量化运算。不需要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)


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

关于python - 在 Pandas 中创建公司周数和年份,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52936279/

10-16 12:59