Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用包含日期的逻辑表达式对时间序列进行切片_Python_Pandas_Time Series_Slice_Logical Operators - Fatal编程技术网

Python 如何使用包含日期的逻辑表达式对时间序列进行切片

Python 如何使用包含日期的逻辑表达式对时间序列进行切片,python,pandas,time-series,slice,logical-operators,Python,Pandas,Time Series,Slice,Logical Operators,我想了解Pandas中使用timeseries进行切片的情况,我正在研究在涉及日期的逻辑语句中进行组合的可能性(组合and,or,而不是操作数) 这是一个可重复的例子: HAO_10 Date Price 2018-01-02 30.240000 2018-01-03 30.629999 2018-01-04 30.860001 2018-01-05 31.010000 2018-01-08 31.389999 2018-01-09 31.309999 2018-01

我想了解Pandas中使用timeseries进行切片的情况,我正在研究在涉及日期的逻辑语句中进行组合的可能性(组合and,or,而不是操作数)

这是一个可重复的例子:

HAO_10
Date         Price
2018-01-02  30.240000
2018-01-03  30.629999
2018-01-04  30.860001
2018-01-05  31.010000
2018-01-08  31.389999
2018-01-09  31.309999
2018-01-10  31.400000
2018-01-11  31.580000
2018-01-12  31.680000
2018-01-16  31.200001

HAO_10.iloc[((HAO_10.index < datetime.strptime('2018-01-04', '%Y-%m-%d')) | 

             ((HAO_10.index > datetime.strptime('2018-01-08', '%Y-%m-%d')) & 
        (HAO_10.index  != datetime.strptime('2018-01-12', '%Y-%m-%d')))), ]
HAO_10
日期价格
2018-01-02  30.240000
2018-01-03  30.629999
2018-01-04  30.860001
2018-01-05  31.010000
2018-01-08  31.389999
2018-01-09  31.309999
2018-01-10  31.400000
2018-01-11  31.580000
2018-01-12  31.680000
2018-01-16  31.200001
HAO_10.iloc[(HAO_10.indexdatetime.strtime('2018-01-08','%Y-%m-%d'))和
(HAO_10.index!=datetime.strtime('2018-01-12','%Y-%m-%d')),]
这是试图将2018-01-04之前和2018-01-08之后日期对应的值切掉,而不是2018-01-12日期对应的值

它起作用了


有没有更优雅的方法来实现同样的功能?

首先使用
pd.to\u datetime
转换为datetime。然后,您可以在
loc
语句中使用日期字符串:

df['Date'] = pd.to_datetime(df['Date'])

# This says: find where date is not between your range and not equal to 01-12
df.loc[(~df['Date'].between('2018-01-04','2018-01-08')) & (df['Date'] != '2018-01-12')]

        Date      Price
0 2018-01-02  30.240000
1 2018-01-03  30.629999
5 2018-01-09  31.309999
6 2018-01-10  31.400000
7 2018-01-11  31.580000
9 2018-01-16  31.200001

首先使用和创建已删除值的
DatetimeIndex
,然后仅使用原始索引选择:

idx = pd.date_range('2018-01-04','2018-01-08').union(['2018-01-12'])
df = HAO_10.loc[HAO_10.index.difference(idx)]
#another similar solutions
#df = HAO_10.drop(idx, errors='ignore')
#df = HAO_10[~HAO_10.index.isin(idx)]
如果只想使用
date
s,并且
index
还包含
time
s,则s是您的朋友:

df = HAO_10.loc[HAO_10.index.floor('d').difference(idx)]
#another similar solutions
#df = HAO_10[~HAO_10.index.floor('d').isin(idx)]

print (df)
                Price
2018-01-02  30.240000
2018-01-03  30.629999
2018-01-09  31.309999
2018-01-10  31.400000
2018-01-11  31.580000
2018-01-16  31.200001
您的解决方案应该简单:

df = HAO_10[((HAO_10.index < '2018-01-04') | ((HAO_10.index > '2018-01-08') & 
                  (HAO_10.index  != '2018-01-12')))]
df=HAO_10[(HAO_10.index<'2018-01-04')|((HAO_10.index>'2018-01-08')和
(HAO_10.index!=“2018-01-12”))]

太聪明了!我喜欢这个解决方案