我有一个时间序列,虽然被标准的YYYY-MM-DD字符串索引并且有效日期,但不被识别为DatetimeIndex.将它们强制转换为有效的DatetimeIndex似乎不够优雅,让我觉得我做错了什么.
我读入了(其他人的懒惰格式化)包含无效日期时间值的数据并删除了这些无效的观察结果.
In [1]: df = pd.read_csv('data.csv',index_col=0)
In [2]: print df['2008-02-27':'2008-03-02']
Out[2]:
count
2008-02-27 20
2008-02-28 0
2008-02-29 27
2008-02-30 0
2008-02-31 0
2008-03-01 0
2008-03-02 17
In [3]: def clean_timestamps(df):
# remove invalid dates like '2008-02-30' and '2009-04-31'
to_drop = list()
for d in df.index:
try:
datetime.date(int(d[0:4]),int(d[5:7]),int(d[8:10]))
except ValueError:
to_drop.append(d)
df2 = df.drop(to_drop,axis=0)
return df2
In [4]: df2 = clean_timestamps(df)
In [5] :print df2['2008-02-27':'2008-03-02']
Out[5]:
count
2008-02-27 20
2008-02-28 0
2008-02-29 27
2008-03-01 0
2008-03-02 17
Run Code Online (Sandbox Code Playgroud)
这个新索引仍然只被识别为'对象'dtype而不是DatetimeIndex.
In [6]: …Run Code Online (Sandbox Code Playgroud) 我已经看到许多关于如何定义自己的函数的问题,这些函数执行与此类似的操作,但我不知道如何使用 timedelta 的内置函数。有没有人有使用 timedelta.round() 的例子?我有想要舍入到最近的全天的 timedelta 对象。
https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Timedelta.round.html上的文档是:
时间增量.round
将 Timedelta 舍入到指定的分辨率
参数:
freq : 表示舍入分辨率的频率字符串
返回:四舍五入到给定分辨率的新 Timedelta
freq如果频率无法转换,则引发:ValueError
我有一个来自netCDF文件的时间序列,我正在尝试将它们转换为日期时间格式。时间序列的格式为“自1990年1月1日00:00:00起的天数”。最终,我希望以格式输出.strftime('%Y%m%d.%H%M')。因此,例如,我按如下方式读取了netCDF文件
import netCDF4
nc = netCDF4.Dataset(file_name)
time = np.array(nc['time'][:])
Run Code Online (Sandbox Code Playgroud)
然后我有
In [180]: time[0]
Out[180]: 365
In [181]: time[1]
Out[181]: 365.04166666651145
Run Code Online (Sandbox Code Playgroud)
然后我做了
In [182]: start = datetime.datetime(1990,1,1)
In [183]: delta = datetime.timedelta(time[1])
In [184]: new_time = start + delta
In [185]: print(new_time.strftime('%Y%m%d.%H%M'))
19910101.0059
Run Code Online (Sandbox Code Playgroud)
有什么办法可以“舍入”到最近的一个小时,这样我就可以了19910101.0100?