pandas基于现有日期列新增随机未来日期列得到NaN值问题求解
问题原因
出现NaN的核心原因有2个:
- 取值语法错误:你使用
df.loc[idx, ['Date']]、df.loc[idx, ['discharge_date']]时,列名用列表包裹,返回的是长度为1的Series对象而非日期标量,赋值时索引对齐失败,最终生成空值。 - 日期类型问题:如果你的
Date列没有显式转为datetime类型,仍为字符串格式,无法直接和timedelta相加,也会导致空值。
正确实现方案
优先使用向量化操作,效率远高于循环遍历,代码如下:
import pandas as pd import numpy as np # 第一步:确保日期列为datetime格式,避免字符串类型报错 df['Date'] = pd.to_datetime(df['Date']) # 第二步:生成和数据行数一致的随机天数,范围3~50天(randint左闭右开,所以上限填51) random_days = np.random.randint(3, 51, size=len(df)) # 第三步:直接生成新列,无需循环 df['discharge_date'] = df['Date'] + pd.to_timedelta(random_days, unit='D')
如果一定要修改你原来的循环版本实现,只需去掉列名外层的列表包裹即可:
import random from datetime import timedelta df['Date'] = pd.to_datetime(df['Date']) # 遍历第四列(索引从0开始,所以iloc[:,3]对应第四列) for idx, value in df.iloc[:,3].iteritems(): # 直接取列标量值计算,无需用列表包裹列名 df.loc[idx, 'discharge_date'] = df.loc[idx, 'Date'] + timedelta(days=random.randint(3, 50))
内容的提问来源于stack exchange,提问作者Manolo Dominguez Becerra
相关产品推荐
相关产品推荐

