在熊猫中创建公司周数和年份

时间:2018-10-22 19:12:36

标签: python pandas

假设我们有以下df

select
    distinct c.patient_id
  from codes c
  join codes d on d.patient_id = c.patient_id
              and d.visit_id <> c.visit_id
              and d.diagnosis_code = c.diagnosis_code
              and d.visit_date between c.visit_date
                  and dateadd(day, 15, c.visit_date)

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

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

如果月份为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 (四月),则周号为1(因此,我将ISO周号减去13)

如果月份是>= 4,我加39。

如果> = 4,然后年份+ 1,否则我对YEAR使用相同的逻辑

我以为我可以使用一个可以用于数据框的简单for循环

< 4

和年度

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

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

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

5 个答案:

答案 0 :(得分:4)

之所以出现此问题,是因为您要遍历df['Dates']对象中的TimeStamp中的值。这等效于经历df['Dates'][0]df['Dates'][1] ...以提取感兴趣的特征。要提取特定的“与日期相关的功能”(如月,日或周),只需按如下所示提取属性即可:

df['Dates'][0].month

另一方面,df['Dates']本身就是熊猫时间戳记Series对象。要从整个Series中提取这些与日期相关的功能,您必须使用类似以下内容的方法:

df['Dates'].dt.month

这类似于“字符串” Series对象的功能,您必须在其中调用pd.Series.str.<method>来执行必要的字符串操作(例如extract,{{1 }},contains等)。

答案 1 :(得分:4)

不要使用显式循环

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)

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

答案 2 :(得分:2)

语法错误并非来自此处,而是尝试在您的for循环中删除“ dt”:

import pandas as pd

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

for x in df.Dates:
    if x.month >= 4:
        df['Week'] = x.week - 13
    else:
        df['Week'] = x.week + 39


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

由于使用了“数据”和“ df”,因此这个问题有些令人困惑。我希望我不会错过它的解释。

如果它不起作用,您可以发布整个代码,以便我尝试吗?

答案 3 :(得分:2)

您快到了,像这样放dt:

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

答案 4 :(得分:1)

  

但是,如果我愿意   data ['Week'] = data.Dates.dt.week   这给出了所有星期的数字,我在这里缺少基本或必不可少的东西吗?

尝试一下

def my_f(x):
    if x.month >= 4:
        return x.week - 13
    else:
        return x.week + 39


df['Week'] = df.Dates.apply(lambda x: my_f(x))