Python:如何将DataFrame列替换为处理后的datetime值
问题分析与解决方案
核心问题拆解
- datetime存入numpy数组变科学计数法:numpy的float类型数组无法存储datetime对象,会自动将其转换为纳秒级时间戳(大整数转float后显示为科学计数法,如
1.32542e+18)。 - TypeError: unhashable type: 'slice':当
x转为DataFrame后,x[:,0]这种numpy式二维切片语法不被支持,DataFrame需用专属的索引方式操作列。
修正方案:优先用DataFrame处理(推荐)
DataFrame原生支持datetime类型,无需担心类型转换问题,直接构造更高效:
import pandas as pd import numpy as np # 读取并预处理原始数据 dataw = np.array(ds.variables["pr"][:,0,0]) * 86400 lat = ds.variables["lat"][:] long = ds.variables["lon"][:] time_raw = ds.variables["time"][:] # 转换时间为datetime类型 time = pd.to_datetime(time_raw, origin=pd.Timestamp('1850-01-01'), unit='D') # 直接构造DataFrame,避免类型冲突 x = pd.DataFrame({ 'time': time, 'lon': np.full(len(dataw), long), # 用full把单值lat/long扩展为对应长度的数组 'lat': np.full(len(dataw), lat), 'pr': dataw })
若需用numpy数组处理
需创建混合类型结构化数组,指定datetime的dtype,避免自动转时间戳:
# 定义结构化数组的类型 x = np.zeros(len(dataw), dtype=[ ('time', 'datetime64[ns]'), ('lon', float), ('lat', float), ('pr', float) ]) # 赋值各字段 x['time'] = time x['lon'] = long x['lat'] = lat x['pr'] = dataw
错误代码的针对性修复
如果坚持先创建全0数组再转DataFrame,需修正列赋值的语法:
x = pd.DataFrame(np.zeros((len(dataw),4), float)) # 正确的列赋值方式:用iloc按位置索引 x.iloc[:,0] = time x.iloc[:,1] = long x.iloc[:,2] = lat x.iloc[:,3] = dataw * 86400 # 或者给列命名后用列名赋值 x.columns = ['time', 'lon', 'lat', 'pr'] x['time'] = time
内容的提问来源于stack exchange,提问作者Georges Abitbol
相关产品推荐
相关产品推荐

