相关疑难解决方法(0)

将pandas时间序列从对象dtype重新索引到datetime dtype

我有一个时间序列,虽然被标准的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)

python datetime python-2.7 pandas

30
推荐指数
1
解决办法
3万
查看次数

使用 timedelta.round() 函数

我已经看到许多关于如何定义自己的函数的问题,这些函数执行与此类似的操作,但我不知道如何使用 timedelta 的内置函数。有没有人有使用 timedelta.round() 的例子?我有想要舍入到最近的全天的 timedelta 对象。

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Timedelta.round.html上的文档是:

时间增量.round

将 Timedelta 舍入到指定的分辨率

参数:

freq : 表示舍入分辨率的频率字符串

返回:四舍五入到给定分辨率的新 Timedelta freq

如果频率无法转换,则引发:ValueError

python datetime timedelta python-datetime

7
推荐指数
2
解决办法
7361
查看次数

日期时间四舍五入到最接近的小时

我有非常类似的问题这一个这一个,但我卡上出现取舍问题。

我有一个来自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

datetime timedelta python-3.x

2
推荐指数
1
解决办法
4152
查看次数