问题描述
我有一个带有时间列的数据框。第一个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