在DataFrame中选择一个没有日期的时间范围

时间:2018-07-18 22:43:10

标签: python pandas datetime dataframe

我正在使用/学习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()。没有日期,此功能似乎无法使用。

如果我在整个项目中都使用假日期,那不是世界末日。但我想知道周围是否还有更优雅的方法。

1 个答案:

答案 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)})

选择100到200秒之间的数据。

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')

enter image description here


转换为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