创建datetime64 [ns]变量或使用between_time函数?

问题描述

我有一个带有时间列的数据框。第一个df.dtypes返回“ object”,所有值都看起来像这样:

2019-10-18T08:13:26.702000

我使用pd.to_datetime,并且df.dtypes返回“ 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,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,2                                                     datetime.time(2019,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 [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

解决方法

您需要DatetimeIndex列中的ts,一种可能的解决方案是使用DatetimeIndex或将列转换为索引并选择.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,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,然后使用DataFrame.between_time

df['ts'] = pd.to_datetime(df['ts'])
df = df.set_index('ts').between_time(datetime.time(8,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