Python 添加带有日期的列
我想添加一个date difference列,其中需要一些日期,然后减去df中的date列。棘手的部分是,如果Id没有显示两次,它只会计算名称列中是否有字符串X。比如说, df 如果我使用currentdate=datetime.date(2017,5,1),结果将是:Python 添加带有日期的列,python,pandas,datediff,Python,Pandas,Datediff,我想添加一个date difference列,其中需要一些日期,然后减去df中的date列。棘手的部分是,如果Id没有显示两次,它只会计算名称列中是否有字符串X。比如说, df 如果我使用currentdate=datetime.date(2017,5,1),结果将是: Id Date Name Diff 111 1/1/17 Xyz 4 123 1/2/17 Xab 3 222 1/1/17 abc 0 222 1/2/17 Xab 0 (this is 0 since
Id Date Name Diff
111 1/1/17 Xyz 4
123 1/2/17 Xab 3
222 1/1/17 abc 0
222 1/2/17 Xab 0 (this is 0 since 222 already showed up)
333 1/1/17 abc 0
333 1/2/17 def 0
我的方法是按字符串“X”对它们进行分组,但我不确定如何在唯一的行中进行分组。
提前谢谢你 首先,创建一个timestamp对象-
d = pd.to_datetime('2017-01-5')
选项1现在,计算差异,并根据您的条件使用
mask
隐藏行-
m = df['Id'].duplicated(keep=False) | ~df['Name'].str.contains('X')
df['Diff'] = (d - pd.to_datetime(df['Date'])).dt.days.mask(m, 0)
df
Id Date Name Diff
0 111 1/1/17 Xyz 4
1 123 1/2/17 Xab 3
2 222 1/1/17 abc 0
3 222 1/2/17 Xab 0
4 333 1/1/17 abc 0
5 333 1/2/17 def 0
我使用pd.Series.duplicated
删除那些重复条目,并使用str.contains
检查X
是否位于Name
中
选项2
您可以使用
np.where
,但方法类似-
m = df['Id'].duplicated(keep=False) | ~df['Name'].str.contains('X')
df['Diff'] = np.where(m, 0, (d - pd.to_datetime(df['Date'])).dt.days)
df
Id Date Name Diff
0 111 1/1/17 Xyz 4
1 123 1/2/17 Xab 3
2 222 1/1/17 abc 0
3 222 1/2/17 Xab 0
4 333 1/1/17 abc 0
5 333 1/2/17 def 0
你能解释一下
1/1/17
-5/31/17
是4吗?@COLDSPEED我的意思是5/1/17-1/1/17=4你约会的第一个?日期还是月份?第一个是月mm/dd/yyyy:)写了一个答案,如果我误解了你,请告诉我。当我的Id字段之间有空格时,有一个错误语法,类似于“Id num”。我们有办法解决这个问题吗?@TylerNG是的。。。使用['…']
符号代替
符号。看到我的编辑了吗?@COLDSPEED这很奇怪,当我试着编辑时,只要日期不是2017年1月1日,计算就会停止。也许是因为我的实际数据要复杂得多。是否有一种方法可以替代strx?我只是想一想。@TylerNG不,我不明白这有什么意义,因为X
与重复的ID无关(我猜)。你能不能改变你的数据,并提供一份能准确再现你所遇到问题的报告?@TylerNG我相信,这是最好的方法~
m = df['Id'].duplicated(keep=False) | ~df['Name'].str.contains('X')
df['Diff'] = np.where(m, 0, (d - pd.to_datetime(df['Date'])).dt.days)
df
Id Date Name Diff
0 111 1/1/17 Xyz 4
1 123 1/2/17 Xab 3
2 222 1/1/17 abc 0
3 222 1/2/17 Xab 0
4 333 1/1/17 abc 0
5 333 1/2/17 def 0