Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 添加带有日期的列_Python_Pandas_Datediff - Fatal编程技术网

Python 添加带有日期的列

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

我想添加一个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 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