python - Python - 多个锚点的日期差异
问题描述
我希望通过 ID 之间的某些锚点来查找日期差异。为了详细说明锚点,它们只是我在数据集中感兴趣的日期。一个 ID 可能有一个、两个、三个或更多锚点。
第一个锚点之前的日期应该与第一个锚点相关联。如果只有一个锚点,则所有日期都应与第一个锚点相关联。如果有相同 ID 的第二个锚点,则第一个锚点之后的所有日期都应与第二个锚点日期相关联。如果有第三个锚点,那么第二个锚点之后的所有日期都应该与第三个锚点相关联,依此类推。
输入
ID Date Anchor
123 1/5/2018 N
123 4/10/2018 N
123 5/8/2018 Y
123 5/10/2018 N
123 6/14/2018 N
123 7/8/2018 Y
123 8/2/2018 N
123 10/3/2018 N
234 1/4/2018 N
234 2/5/2018 Y
234 4/10/2018 N
234 5/6/2018 Y
预期输出:
ID Date Anchor Date Diff (Days)
123 1/5/2018 N -123
123 4/10/2018 N -28
123 5/8/2018 Y 0
123 5/10/2018 N -59
123 6/14/2018 N -24
123 7/8/2018 Y 0
123 8/2/2018 N 25
123 10/3/2018 N 87
234 1/4/2018 N -32
234 2/5/2018 Y 0
234 4/10/2018 N -26
234 5/6/2018 Y 0
代码尝试
df['Date'] = pd.to_datetime(df['Date'])
df.groupby('ID')
anchors = dict()
for index, row in df.iterrows():
if row['Anchor Date'] == 'Y':
if row['ID'] in anchors:
anchors[row['ID']].append(row['Date'])
else:
anchors[row['ID']] = [row['Date']]
daysDifference = list()
for index, row in df.iterrows():
if row['Anchor Date'] == 'N':
delta = 9999 #Arbitrary value
for anchorDate in anchors[row['ID']]:
if abs((row['Date'] - anchorDate).days) < delta:
delta = (row['Date'] - anchorDate).days
daysDifference.append(delta)
else:
daysDifference.append(0)
df['Diff'] = daysDifference
解决方案
您可以使用where
和groupby.bfill
到作业,使用ffill
来完成填充。
s = pd.to_datetime(df['Date'])
df['diff_'] = (s - s.where(df['Anchor'].eq('Y'))
.groupby(df['ID'])
.apply(lambda x: x.bfill().ffill())
).dt.days
print (df)
ID Date Anchor diff_
0 123 1/5/2018 N -123
1 123 4/10/2018 N -28
2 123 5/8/2018 Y 0
3 123 5/10/2018 N -59
4 123 6/14/2018 N -24
5 123 7/8/2018 Y 0
6 123 8/2/2018 N 25
7 123 10/3/2018 N 87
8 234 1/4/2018 N -32
9 234 2/5/2018 Y 0
10 234 4/10/2018 N -26
11 234 5/6/2018 Y 0
推荐阅读
- sparql - SPARQL 让所有属性在本地 wikidata 中不起作用
- ios - 如何从时间选择器中选择的时间中减去十分钟?
- excel - 关于访问记录集的问题 - 只有第一个事件有效
- spring-boot - 如何将服务注入 Thymeleaf 标签处理器
- jquery - 发送选择选项对象并获取不带 ajax 的列表(thymeleaf)
- arrays - 不使用路线的对象角度过滤器问题(Angular TS)
- rust - 不能在向量推送中借用“&”引用中的数据作为可变数据
- angular - Ionic 3 项目未通过抛出错误生成生产 apk
- javascript - 如何通过检查 React js 中的所有数据库值来设置按钮颜色?
- kdb - 根据标准在KDB中标记前N天的值?