熊猫时间序列将条目转换为浮点后显示NaN

时间:2019-01-19 05:25:50

标签: python pandas jupyter

我正在尝试从数据帧获取时间序列。我的数据框包含两个所需的列-时间戳记和速度。到目前为止,这是我的代码:

第1步:我将所需的Speed列中的所有空格替换为0

bus1354['Speed'].replace('   ',0,inplace=True)

第2步:然后检查“速度”列中是否有NaN值

assert not bus1354['Speed'].isnull().any()

步骤3:然后,我在数据框中同时检查Timestamp和Speed列的前几个条目

bus1354[['Timestamp','Speed']].head()

这是我得到的结果(到目前为止很好):

enter image description here

步骤4:然后我截断时间戳,以便仅显示hh:mm:ss并除去毫秒。我也将转换为日期时间格式。

bus1354['Timestamp'] = pd.to_datetime(bus1354['Timestamp'].apply(lambda x : x[:7]))

第5步:我检查截断的结果

bus1354['Timestamp'].head()

这是下面的样子:

enter image description here

步骤6:然后我将速度从非空对象转换为float64

bus1354['Speed'] = bus1354['Speed'].apply(float)

第7步:我创建一个时间范围和时间序列

bstimeRng = bus1354['Timestamp']
bs1354Ser = pd.Series(bus1354['Speed'], index=bstimeRng)

步骤8:但是,一旦我输出了时间序列,我的Speed列就会得到一堆NaN。

bs1354Ser

enter image description here

我还在学习熊猫的来龙去脉,所以如果这听起来像是一个基本问题,请多多包涵。为什么即使在将Speed列更改为float64之后,时间序列仍将所需的Speed值显示为“ NaN”?

1 个答案:

答案 0 :(得分:0)

最好使用set_index

s1354Ser = bus1354.set_index('Timestamp')['Speed']

示例

bus1354 = pd.DataFrame(
        {'Timestamp':['08:38:00:009','08:38:00:013','08:38:00:019'],
        'Speed':[42,42,43]})


print (bus1354)
      Timestamp  Speed
0  08:38:00:009     42
1  08:38:00:013     42
2  08:38:00:019     43

bus1354['Timestamp'] = pd.to_datetime(bus1354['Timestamp'].str[:7])
bus1354['Speed'] = bus1354['Speed'].astype(float)

s1354Ser = bus1354.set_index('Timestamp')['Speed']
print (s1354Ser)
Timestamp
2019-01-19 08:38:00    42.0
2019-01-19 08:38:00    42.0
2019-01-19 08:38:00    43.0
Name: Speed, dtype: float64

解决方案中缺少值就是问题数据对齐:

#sample data
df = pd.DataFrame(
        {'a':[0,2,3],
         'b':[41,42,43]})


print (df)
   a   b
0  0  41
1  2  42
2  3  43

如果检查原始数据的索引:

print (df.index.tolist())
[0, 1, 2]

a列的值用于新索引:

print (df['a'].tolist())
[0, 2, 3]

然后如果可能的话,Series对齐数据-如果a的值不存在,则创建NaN的新索引,将s = pd.Series(df['b'], index=df['a']) print (s) a 0 41.0 <-align by 0 from original index 2 43.0 <-align by 2 from original index 3 NaN <- not exist 3, so NaN Name: b, dtype: float64 列中的旧索引换成新索引:

Speed

但是如果将Series的值通过values转换为numpy 1d数组,则该数组没有像s1354Ser = pd.Series(bus1354['Speed'].values, index=bstimeRng) s = pd.Series(df['b'].values, index=df['a']) print (s) a 0 41 2 42 3 43 dtype: int64 那样的索引:

{{1}}