我正在尝试从数据帧获取时间序列。我的数据框包含两个所需的列-时间戳记和速度。到目前为止,这是我的代码:
第1步:我将所需的Speed列中的所有空格替换为0
bus1354['Speed'].replace(' ',0,inplace=True)
第2步:然后检查“速度”列中是否有NaN值
assert not bus1354['Speed'].isnull().any()
步骤3:然后,我在数据框中同时检查Timestamp和Speed列的前几个条目
bus1354[['Timestamp','Speed']].head()
这是我得到的结果(到目前为止很好):
步骤4:然后我截断时间戳,以便仅显示hh:mm:ss并除去毫秒。我也将转换为日期时间格式。
bus1354['Timestamp'] = pd.to_datetime(bus1354['Timestamp'].apply(lambda x : x[:7]))
第5步:我检查截断的结果
bus1354['Timestamp'].head()
这是下面的样子:
步骤6:然后我将速度从非空对象转换为float64
bus1354['Speed'] = bus1354['Speed'].apply(float)
第7步:我创建一个时间范围和时间序列
bstimeRng = bus1354['Timestamp']
bs1354Ser = pd.Series(bus1354['Speed'], index=bstimeRng)
步骤8:但是,一旦我输出了时间序列,我的Speed列就会得到一堆NaN。
bs1354Ser
我还在学习熊猫的来龙去脉,所以如果这听起来像是一个基本问题,请多多包涵。为什么即使在将Speed列更改为float64之后,时间序列仍将所需的Speed值显示为“ NaN”?
答案 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}}