考虑一下:
import pandas as pd
import numpy as np
idx2=[pd.to_datetime('2016-08-31 22:08:12.000'),
pd.to_datetime('2016-08-31 22:08:12.200'),
pd.to_datetime('2016-08-31 22:08:12.400')]
test=pd.DataFrame({'value':[1,1,3], 'groups' : ['A',np.NaN,'A']},index=idx2)
test
Out[27]:
groups value
2016-08-31 22:08:12.000 A 1
2016-08-31 22:08:12.200 NaN 1
2016-08-31 22:08:12.400 A 3
我只需要在22:08:12.200
和22:08:12.400
之间保留数据,所以我自然会使用between_time
:
test.between_time('22:08:12.200','22:08:12.400')
给出
ValueError:无法将arg [' 08:08:12.200']转换为时间
这里有什么问题?如何根据时间以毫秒信息对dataframe
进行切片?
答案 0 :(得分:4)
我不确定为什么直接字符串不起作用,但它看起来与来自字符串的datetime
的时间转换有关。但是,您可以通过明确转换为time
来解决此问题:
<强>代码:强>
test.between_time(*pd.to_datetime(['22:08:12.200', '22:08:12.400']).time)
测试代码:
import pandas as pd
import numpy as np
idx2 = [
pd.to_datetime('2016-08-31 22:08:12.000'),
pd.to_datetime('2016-08-31 22:08:12.200'),
pd.to_datetime('2016-08-31 22:08:12.400')]
test = pd.DataFrame(
{'value': [1, 1, 3], 'groups': ['A', np.NaN, 'A']}, index=idx2)
print(test.between_time(
*pd.to_datetime(['22:08:12.200', '22:08:12.400']).time))
<强>结果:强>
groups value
2016-08-31 22:08:12.200 NaN 1
2016-08-31 22:08:12.400 A 3
答案 1 :(得分:0)
您可以使用标准日期时间:
test.between_time(datetime.time(22,8,12,200000),datetime.time(22,8,12,400000),include_start=True,include_end=True)
答案 2 :(得分:0)
您不需要使用ween_time,您可以直接在索引上切片。
test[(test.index >= '2016-08-31 22:08:12.200') & (test.index <='2016-08-31 22:08:12.400')]
无论出于何种原因,如果指定了毫秒,则跟随将不起作用。
# doesn't work with milliseconds:
test['2016-08-31 22:08:12':'2016-08-31 22:08:12']