首页 > 解决方案 > pd.Timestamp.replace 迭代

问题描述

数据

res=pd.DataFrame({'period':['s', 'e', 's', 'e'], 'lapse':[-1.0, 1.0, -1, 1],'date':['1975-02-25 09:39:39.914889', '1976-03-25 09:41:09.103102', '1978-05-25 10:39:58.352073', '1979-09-25 10:40:06.266782']})

我需要迭代地选择lapse==-1失误并更改hourminute

使用以下内容,我可以选择和更改它们,但这也会改变年份。

res['date']=pd.to_datetime(res['date'])
a=res[(res['lapse']==-1.0) & (res['period']=='s')]
a['date']=pd.Timestamp.replace(a.loc[0,'date'], hour=18, minute=15)

在此处输入图像描述

那不是我想要的。我正在处理 0ver 20,000 条土地记录,我需要遍历它们。我试过了

import datetime
for index, row in a.iterrows():
    print(row['date'])
    row['date']=pd.Timestamp.replace(row['date'], hour=17, minute=15)

期望的结果

在此处输入图像描述

标签: python-3.xpandas

解决方案


您可以按掩码过滤行date并仅更改这些值的日期时间:

res['date']=pd.to_datetime(res['date'])
m= (res['lapse']==-1.0) & (res['period']=='s')
res.loc[m, 'date']= res.loc[m, 'date'].apply(lambda x: x.replace(hour=18, minute=15))
#alternative solution
#res.loc[m, 'date']= res.loc[m, 'date'] + pd.offsets.DateOffset(hour=18, minute=15)
print (res)
 period  lapse                          date
0      s   -1.0 1975-02-25 18:15:39.914888992
1      e    1.0 1976-03-25 09:41:09.103102016
2      s   -1.0 1978-05-25 18:15:58.352072992
3      e    1.0 1979-09-25 10:40:06.266782016

推荐阅读