我正在使用/学习Pandas
来加载csv样式数据集,其中有一个可用作索引的时间列。数据大约以100Hz采样。这是数据的简化片段:
Time (sec) Col_A Col_B Col_C
0.0100 14.175 -29.97 -22.68
0.0200 13.905 -29.835 -22.68
0.0300 12.257 -29.32 -22.67
... ...
1259.98 -0.405 2.205 3.825
1259.99 -0.495 2.115 3.735
有20分钟的数据,在100 Hz下产生了约120,000行。我的目标是在特定时间范围内(例如100-200秒)选择这些行。
这就是我所想的
import panda as pd
df = pd.DataFrame(my_data) # my_data is a numpy array
df.set_index(0, inplace=True)
df.columns = ['Col_A', 'Col_B', 'Col_C']
df.index = pd.to_datetime(df.index, unit='s', origin='1900-1-1') # the date in origin is just a space-holder
我的数据集不包含日期。如何避免像我之前那样设置假日期?感觉不对,而且在按时间绘制数据时也很烦人。
我知道有一些方法可以从数据时间对象中删除日期,例如here。
但是我的目标是选择在特定时间范围内的一些行,这意味着我需要使用pd.date_range()
。没有日期,此功能似乎无法使用。
如果我在整个项目中都使用假日期,那不是世界末日。但我想知道周围是否还有更优雅的方法。
答案 0 :(得分:2)
我不明白为什么需要为此使用datetime64
对象。您的时间栏是一个数字,因此您可以轻松地选择不相等的时间间隔。您也可以绘制列而没有问题。
import pandas as pd
import numpy as np
np.random.seed(123)
df = pd.DataFrame({'Time': np.arange(0,1200,0.01),
'Col_A': np.random.randint(1,100,120000),
'Col_B': np.random.randint(1,10,120000)})
df[df.Time.between(100,200)]
输出:
Time Col_A Col_B
10000 100.00 75 9
10001 100.01 23 7
...
19999 199.99 39 7
20000 200.00 25 2
#First 100 rows just for illustration
df[0:100].plot(x='Time')
timedelta64
如果您确实愿意,可以将该列转换为timedelta64[ns]
df['Time'] = pd.to_datetime(df.Time, unit='s') - pd.to_datetime('1970-01-01')
print(df.head())
# Time Col_A Col_B
#0 00:00:00 67 6
#1 00:00:00.010000 93 1
#2 00:00:00.020000 99 3
#3 00:00:00.030000 18 2
#4 00:00:00.040000 84 3
df.dtypes
#Time timedelta64[ns]
#Col_A int32
#Col_B int32
#dtype: object