假设我们有以下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
这给出了所有星期的数字,我在这里错过了一些基本的或必不可少的东西吗?
我希望这是简洁明了的,任何建议(甚至如何提出更好的问题)都值得赞赏。
答案 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))