Numpy np.r_处理日期列异常:日期转为长整数的问题求助
问题分析与解决办法
先排查原始数据问题
- 先打印第二类数据集目标列的前10行,确认是不是真的全是
"YYYY-MM-DD HH:MM:SS"格式:print(pd_df.iloc[:, np.r_[5:7,9]].head(10)) - 再检查列里的元素类型,看有没有混进数值(比如时间戳):
你看到的长整数是纳秒级时间戳(比如1681689600000000000对应2023-04-16 00:00:00),说明第二类数据集的日期列表面是print(pd_df.iloc[:, np.r_[5:7,9]].applymap(type).value_counts())object类型,但实际混了数值型的时间戳,导致pd.to_datetime没按你指定的format解析,反而自动识别成了时间戳。
针对性解决方法
方法1:统一转字符串后解析
先把所有元素转成字符串,再按指定格式解析,避免数值干扰:
cols = np.r_[5:7,9] pd_df.iloc[:, cols] = pd_df.iloc[:, cols].astype(str).apply(pd.to_datetime, format='%Y-%m-%d', errors='coerce')
如果转字符串后有纯数字的时间戳(会被转成NaT),可以用自定义函数分情况处理:
def parse_date(x): try: # 先尝试按日期格式解析 return pd.to_datetime(x, format='%Y-%m-%d') except: # 解析失败就按纳秒时间戳处理,毫秒级就改unit='ms',秒级改unit='s' return pd.to_datetime(int(x), unit='ns') cols = np.r_[5:7,9] pd_df.iloc[:, cols] = pd_df.iloc[:, cols].applymap(parse_date)
方法2:分类型解析
直接判断元素类型,字符串按格式解析,数值按时间戳解析:
cols = np.r_[5:7,9] pd_df.iloc[:, cols] = pd_df.iloc[:, cols].apply(lambda x: pd.to_datetime(x, format='%Y-%m-%d') if isinstance(x, str) and '-' in x else pd.to_datetime(x, unit='ns') )
验证转换结果
转换完后检查列类型和数据是否正常:
print(pd_df.iloc[:, cols].dtypes) print(pd_df.iloc[:, cols].head())
内容的提问来源于stack exchange,提问作者Gerlex
相关产品推荐
相关产品推荐

