You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python:如何将DataFrame列替换为处理后的datetime值

问题分析与解决方案

核心问题拆解

  1. datetime存入numpy数组变科学计数法:numpy的float类型数组无法存储datetime对象,会自动将其转换为纳秒级时间戳(大整数转float后显示为科学计数法,如1.32542e+18)。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 03:35:42