如何使用时间戳对Pandas DataFrame进行升采样

时间:2018-11-18 13:51:10

标签: python pandas resampling

我有一个这样的DataFrame(不在乎NaN值):

enter image description here

我想每20毫秒对它进行一次上采样。

我所做的是:

df = df.set_index('TIMESTAMP')
df = df.resample('20ms').ffill()

但是我得到了错误:

Traceback (most recent call last):
sens_encoded = sens_encoded.resample('20ms').ffill()
TypeError: Only valid with DatetimeIndex, TimedeltaIndex or PeriodIndex, but got an instance of 'Index'

所以我尝试将TIMESTAMP转换为DateTime,该日期应该已经是:

df = df.set_index('TIMESTAMP')
df.index = pd.to_datetime(df.index)   //Added this
df = df.resample('20ms').ffill()

但是我得到了错误:

Traceback (most recent call last):
df.index = pd.to_datetime(df.index)
TypeError: <class 'tuple'> is not convertible to datetime

编辑:

我认为问题可能是在set_index('TIMESTAMP')之后,数据帧看起来像这样(请注意时间戳值中的括号):

enter image description here

EDIT2

我发现了为什么要在df中得到这些括号。 这是因为我在创建它时将列名分配为方括号内的列表。正确的方法是:

columns_names = ['D07', 'C10', ...]
df = pd.DataFrame(columns=columns_names)

df = pd.DataFrame(columns = [columns_names])

2 个答案:

答案 0 :(得分:2)

首先将MultiIndex的第一级设置为列,以删除损坏的一个级别MultiIndex

添加参数errors='coerce',以便在必要时将不可解析的值转换为NaT,也可以首先转换列,然后创建DatetimeIndex,最后创建upsample

df.columns = df.columns.get_level_values(0)

df['TIMESTAMP'] = pd.to_datetime(df['TIMESTAMP'], errors='coerce')
df = df.set_index('TIMESTAMP').resample('20ms').ffill()

或者:

df.columns = df.columns.get_level_values(0)

df = df.set_index('TIMESTAMP')
df.index = pd.to_datetime(df.index, errors='coerce')
df = df.resample('20ms').ffill()

答案 1 :(得分:0)

这应该可以解决问题:

df.set_index(pd.to_datetime(df.TIMESTAMP), inplace=True)
df = df.resample('20ms').ffill()