使用R已经好几年了,我开始冒险学习python,首先编辑一些现有的代码。
我有一个从netCDF文件导入的时间变量,如下所示:
import netCDF4 as nc
import numpy as np
import datetime
import pandas as pd
f = nc.Dataset(fname)
time = nc.num2date(f.variables['time'][:],
f.variables['time'].units)
nc_dims = [dim for dim in f.dimensions]
时间变量被添加到数据帧df
:中名为'dates'
的列中
df['dates'] = time
然后将其转换为索引:
df = df.set_index('dates')
为数据帧定义了两个新列,这两个列都要求索引具有正确的日期时间数据格式(我认为(。
df['season'] = (df.index.month) % 12 + 3) // 3
df['day'] = np.floor(df.index.to_julian_date().values - 0.5)
但是,当代码在命令提示符下运行时,会出现错误:
AttributeError:"Index"对象没有属性"month";和
"Index"对象没有属性"to_julian_date">
这让我认为索引对象没有正确定义为日期-时间对象(因此month调用不起作用(,而且它不知道它可以将对象转换为julian日期格式。要么是这样,要么我错过了一个重要的包裹。
我已经尝试使用转换索引
pd.Timestamp(time)
df = df.set_index(pd.DatetimeIndex('dates'))
df.index = pd.to_datetime(df.index)
但是获取指示索引对象已采用日期-时间格式的错误:
TypeError:无法转换输入[[cftime.DatetimeGregory(2011-01-0100:30:00.13(类型错误:为无法转换为datetime TypeError:无法转换为日期时间
知道这些代码确实在我的同事环境中运行,我觉得我错过了拼图中的一个重要部分。任何人可以提供的任何帮助,可以帮助我调试这一点,非常感谢!
编辑:
以下是一个小样本数据:
iveg_1 iveg_2 patchfrac_1 patchfrac_2
dates
2011-01-01 00:30:00.13 2 6 1.0 0.0
2011-01-01 01:00:00 2 6 1.0 0.0
2011-01-01 01:30:00 2 6 1.0 0.0
2011-01-01 02:00:00.13 2 6 1.0 0.0
2011-01-01 02:30:00 2 6 1.0 0.0
2011-01-01 03:00:00 2 6 1.0 0.0
2011-01-01 03:30:00.13 2 6 1.0 0.0
2011-01-01 04:00:00 2 6 1.0 0.0
2011-01-01 04:30:00 2 6 1.0 0.0
2011-01-01 05:00:00.13 2 6 1.0 0.0
首先尝试转换为字符串:
df['dates'] = time
df['dates'] = pd.to_datetime(df['dates'].astype('str'))
df = df.set_index('dates')
使用df.info()
验证您是否正在使用DateTimeIndex
。
DateTimeIndex
对象将允许您从中提取日期信息,例如其月份或转换.to_julian_date()
。