我有一个包含 100,000 多行的日期时间索引数据框对象。我想知道是否有一种方便的方法使用 pandas 来获取多个日期范围内的此数据框的子集。
例如,假设我们有两个日期范围:
(datetime.datetime(2016,6,27,0,0,0), datetime.datetime(2016,6,27,5,0,0)
和
(datetime.datetime(2016,6,27,15,0,0), datetime.datetime(2016,6,27,23,59,59)
假设我们想要获取第一个日期范围或第二个日期范围内的数据框对象的所有行,其中数据框对象从 2016-06-27 00 开始每秒都有行: 00:00
到 2016-06-27 23:59:59
。 pandas 有没有简单的方法来做到这一点?
最佳答案
有two main ways按日期对具有 DatetimeIndex 的 DataFrame 进行切片。
按切片:
df.loc[start:end]
。如果有多个日期范围,单个 切片可以用pd.concat
连接起来。通过 bool 选择掩码:
df.loc[mask]
使用 pd.concat 和切片:
import numpy as np
import pandas as pd
np.random.seed(2016)
N = 10**2
df = pd.DataFrame(np.random.randint(10, size=(N, 2)),
index=pd.date_range('2016-6-27', periods=N, freq='45T'))
result = pd.concat([df.loc['2016-6-27':'2016-6-27 5:00'],
df.loc['2016-6-27 15:00':'2016-6-27 23:59:59']])
产量
0 1
2016-06-27 00:00:00 0 2
2016-06-27 00:45:00 5 5
2016-06-27 01:30:00 9 6
2016-06-27 02:15:00 8 4
2016-06-27 03:00:00 5 0
2016-06-27 03:45:00 4 8
2016-06-27 04:30:00 7 0
2016-06-27 15:00:00 2 5
2016-06-27 15:45:00 6 7
2016-06-27 16:30:00 6 8
2016-06-27 17:15:00 5 1
2016-06-27 18:00:00 2 9
2016-06-27 18:45:00 9 1
2016-06-27 19:30:00 9 7
2016-06-27 20:15:00 3 6
2016-06-27 21:00:00 3 5
2016-06-27 21:45:00 0 8
2016-06-27 22:30:00 5 6
2016-06-27 23:15:00 0 8
请注意,与 Python 中使用的大多数切片语法不同,
df.loc['2016-6-27':'2016-6-27 5:00']
两端都包含在内——切片定义了一个闭区间,不是 半开区间。
使用 bool 选择掩码:
mask = (((df.index >= '2016-6-27') & (df.index <= '2016-6-27 5:00'))
| ((df.index >= '2016-6-27 15:00') & (df.index < '2016-6-28')))
result2 = df.loc[mask]
assert result.equals(result2)
关于python - 具有多个日期范围的 Pandas.DataFrame 切片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38266461/