创建一个 datetime64[ns] 变量(或使用 between_time 函数?)

Create a datetime64[ns] variable (or use between_time function?)

我有一个带有时间列的数据框。首先 df.dtypes return ‘object’ 和值都是这样的:

2019-10-18T08:13:26.702000

我使用 pd.to_datetime 和 df.dtypes return 'datetime64[ns]' 值都如下所示:

2019-10-18 08:13:26.702000

我希望能够根据时间间隔选择一个日期范围。我第一次尝试:

df.iloc[pd.DatetimeIndex['ts'].indexer_between_time(datetime.time(2019,10,18,8,19,0),
                                                    datetime.time(2019,10,18,8,21,0))]

然后我得到 TypeError:

TypeError                                 Traceback (most recent call last)
<ipython-input-31-9e1f5757369e> in <module>
----> 1 df.iloc[pd.DatetimeIndex['ts'].indexer_between_time(datetime.time(2019,10,18,8,19,0),
      2                                                     datetime.time(2019,10,18,8,21,0))]
      3 
      4 
      5 #df.pd.DatetimeIndex['ts'].indexer_between_time(time(8:19), time(08:21:00))

TypeError: 'type' object is not subscriptable

然后我尝试通过定义一个 datetime64[ns] 变量来变通,然后尝试执行“大于和小于”选择。但是我无法在没有错误的情况下定义变量。 (而且不确定这个解决方法是否有效......?)

time1 = pd.datetime.datetime64[ns](2019-10-18T08:19:00.0)

给出:

SyntaxError: invalid syntax

整理数据帧时间间隔的最佳方法是什么?我需要能够按秒排序,而不是毫秒。

如果需要,这是转换为 datetime64 后我的 dateframe 的一部分[ns]:

                        ts  value
0  2019-10-18 08:13:26.702     14
1  2019-10-18 08:13:26.765     10
2  2019-10-18 08:13:26.790      5
3  2019-10-18 08:13:26.889      6
4  2019-10-18 08:13:26.901      8
5  2019-10-18 08:13:27.083     33
6  2019-10-18 08:13:27.098     21
7  2019-10-18 08:13:27.101     11
8  2019-10-18 08:13:27.129     22
9  2019-10-18 08:13:27.159     29
10 2019-10-18 08:13:27.188      7
11 2019-10-18 08:13:27.212     20
12 2019-10-18 08:13:27.228     24
13 2019-10-18 08:13:27.246     30
14 2019-10-18 08:13:27.395     34
15 2019-10-18 08:23:26.375     40
16 2019-10-18 08:23:26.527     49
17 2019-10-18 08:23:26.725     48

您需要 ts 列中的 DatetimeIndex,一种可能的解决方案是使用 DatetimeIndex 或将列转换为索引和 select .index:

df['ts'] = pd.to_datetime(df['ts'])
df = df.iloc[pd.DatetimeIndex(df['ts']).indexer_between_time(datetime.time(8,20,0),
                                                             datetime.time(8,27,0))]

df['ts'] = pd.to_datetime(df['ts'])
df = df.iloc[df.set_index('ts').index.indexer_between_time(datetime.time(8,20,0),
                                                           datetime.time(8,27,0))]

print (df)
                        ts  value
15 2019-10-18 08:23:26.375     40
16 2019-10-18 08:23:26.527     49
17 2019-10-18 08:23:26.725     48

但更简单的解决方案是如果使用 DatetimeIndex - 将列 ts 转换为 DataFrame.set_index and then use DataFrame.between_time:

df['ts'] = pd.to_datetime(df['ts'])
df = df.set_index('ts').between_time(datetime.time(8,20,0), datetime.time(8,27,0))
print (df)
                         value
ts                            
2019-10-18 08:23:26.375     40
2019-10-18 08:23:26.527     49
2019-10-18 08:23:26.725     48