Python:对于每一行,获取值> 0的下一个较早日期

尝试获取值 > 0 的当前或过去日期。将使用它来计算自值 > 0 以来的天数。如果日期具有值,则它将为 0 天。


示例数据和所需结果如下所示。数据是“日期”和“值”列,结果是最后两列。


date        value   'date value > 0'    'days since value > 0'

2020-04-30  0       2020-04-28           2

2020-04-29  0       2020-04-28           1

2020-04-28  1       2020-04-28           0 

2020-03-31  6       2020-03-31           0

2020-03-30  1       2020-03-30           0

2020-03-29  3       2020-03-29           0

2020-02-29  0       2020-01-29           31

2020-01-31  0       2020-01-29           2

2020-01-30  0       2020-01-29           1

2020-01-29  1       2020-01-29           0

数据格式可以是字典或数据框。我正在从 csv 导入并将导出回 csv。


逻辑:对于每一行,过滤到仅日期 <= 当前行日期的记录,然后获取值 > 0 的过滤数据框的最大日期。最大日期是“日期值 > 0”。


编辑:我一直在尝试按顺序迭代数据帧记录,例如pandas df.shift(), df.rolling(),df.iloc但坚持如何“回顾”以获取值 > 0 的先前记录的日期。


Cats萌萌
浏览 108回答 1
1回答

qq_花开花谢_0

假设您有一个类型data为“日期”列和datetime64类型为“值”列的数据框int64:>>> data&nbsp; &nbsp; &nbsp; &nbsp; date&nbsp; value0 2020-04-30&nbsp; &nbsp; &nbsp; 01 2020-04-29&nbsp; &nbsp; &nbsp; 02 2020-04-28&nbsp; &nbsp; &nbsp; 13 2020-03-31&nbsp; &nbsp; &nbsp; 64 2020-03-30&nbsp; &nbsp; &nbsp; 15 2020-03-29&nbsp; &nbsp; &nbsp; 36 2020-02-29&nbsp; &nbsp; &nbsp; 07 2020-01-31&nbsp; &nbsp; &nbsp; 08 2020-01-30&nbsp; &nbsp; &nbsp; 09 2020-01-29&nbsp; &nbsp; &nbsp; 1>>> data.dtypesdate&nbsp; &nbsp; &nbsp;datetime64[ns]value&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;int64dtype: object然后你可以按日期的升序对数据帧进行排序,然后创建一个新列“prevdate”来复制“date”列但设置为NaT值为 0 的行,如下所示:data['prevdate'] = data['date'].where(data['value'].ne(0))然后向前填充NaT值:>>> data.sort_values('date', inplace=True)>>> data['prevdate'] = data['date'].where(data['value'].ne(0)).fillna(method='ffill')>>> data&nbsp; &nbsp; &nbsp; &nbsp; date&nbsp; value&nbsp; &nbsp;prevdate9 2020-01-29&nbsp; &nbsp; &nbsp; 1 2020-01-298 2020-01-30&nbsp; &nbsp; &nbsp; 0 2020-01-297 2020-01-31&nbsp; &nbsp; &nbsp; 0 2020-01-296 2020-02-29&nbsp; &nbsp; &nbsp; 0 2020-01-295 2020-03-29&nbsp; &nbsp; &nbsp; 3 2020-03-294 2020-03-30&nbsp; &nbsp; &nbsp; 1 2020-03-303 2020-03-31&nbsp; &nbsp; &nbsp; 6 2020-03-312 2020-04-28&nbsp; &nbsp; &nbsp; 1 2020-04-281 2020-04-29&nbsp; &nbsp; &nbsp; 0 2020-04-280 2020-04-30&nbsp; &nbsp; &nbsp; 0 2020-04-28现在您可以简单地在两个日期列之间进行减法并将差值转换为整数:>>> data['days'] = (data['date'] - data['prevdate']).apply(lambda x: x.days)>>> data&nbsp; &nbsp; &nbsp; &nbsp; date&nbsp; value&nbsp; &nbsp;prevdate&nbsp; days9 2020-01-29&nbsp; &nbsp; &nbsp; 1 2020-01-29&nbsp; &nbsp; &nbsp;08 2020-01-30&nbsp; &nbsp; &nbsp; 0 2020-01-29&nbsp; &nbsp; &nbsp;17 2020-01-31&nbsp; &nbsp; &nbsp; 0 2020-01-29&nbsp; &nbsp; &nbsp;26 2020-02-29&nbsp; &nbsp; &nbsp; 0 2020-01-29&nbsp; &nbsp; 315 2020-03-29&nbsp; &nbsp; &nbsp; 3 2020-03-29&nbsp; &nbsp; &nbsp;04 2020-03-30&nbsp; &nbsp; &nbsp; 1 2020-03-30&nbsp; &nbsp; &nbsp;03 2020-03-31&nbsp; &nbsp; &nbsp; 6 2020-03-31&nbsp; &nbsp; &nbsp;02 2020-04-28&nbsp; &nbsp; &nbsp; 1 2020-04-28&nbsp; &nbsp; &nbsp;01 2020-04-29&nbsp; &nbsp; &nbsp; 0 2020-04-28&nbsp; &nbsp; &nbsp;10 2020-04-30&nbsp; &nbsp; &nbsp; 0 2020-04-28&nbsp; &nbsp; &nbsp;2
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python