Python pandas,如何截断DatetimeIndex并仅在特定区间填充缺失数据
2012-10-08 07:12:22 0.0 0 0 2315.6 0 0.0 0
2012-10-08 09:14:00 2306.4 20 326586240 2306.4 472 2306.8 4
2012-10-08 09:15:00 2306.8 34 249805440 2306.8 361 2308.0 26
2012-10-08 09:15:01 2308.0 1 53309040 2307.4 77 2308.6 9
2012-10-08 09:15:01.500000 2308.2 1 124630140 2307.0 180 2308.4 1
2012-10-08 09:15:02 2307.0 5 85846260 2308.2 124 2308.0 9
2012-10-08 09:15:02.500000 2307.0 3 128073540 2307.0 185 2307.6 11
......
2012-10-09 07:19:30 0.0 0 0 2276.6 0 0.0 0
2012-10-09 09:14:00 2283.2 80 98634240 2283.2 144 2283.4 1
2012-10-09 09:15:00 2285.2 18 126814260 2285.2 185 2285.6 3
2012-10-09 09:15:01 2285.8 6 98719560 2286.8 144 2287.0 25
2012-10-09 09:15:01.500000 2287.0 36 144759420 2288.8 211 2289.0 4
2012-10-09 09:15:02 2287.4 6 109829280 2287.4 160 2288.6 5
......
我有一个数据表,里面包含了几天的交易数据。现在我想要的数据时间段是 上午9:00到上午11:30
和 下午1:00到下午3:15
,所以我想做两件事:
- 对于数据表中的每一天,只保留在
上午9:00到上午11:30
和下午1:00到下午3:15
这个时间范围内的数据。 - 在第一步中提到的时间范围内,如果有缺失的数据,用
500毫秒
的频率来填补这些缺失的数据。
不过,pandas的截取功能只能按日期来截取,但我想根据具体的时间来截取数据。同时,我也想知道怎么只在我感兴趣的时间段内填补缺失的数据。
非常感谢!
1 个回答
2
- 对于数据表中的每个日期,只保留时间在上午9点到11点30分,以及下午1点到3点15分之间的数据。
可以使用索引的切片功能来实现,比如:
df = df[start_timestamp:end_timestamp]
- 在第一步中,对于缺失的数据,用500毫秒的频率来填充。
生成一个新的数据表,索引间隔为500毫秒。然后用外连接的方式将这个新数据表和原来的数据表合并。这样你就得到了一个在固定时间间隔内的行数据。缺失的观察值会显示为NaN(空值)。接着,用fillna来填充这些缺失的NaN值。
示例:
In [1]: import pandas as pd
In [2]: import numpy as np
In [3]: data = pd.DataFrame({"value": np.arange(5)}, index=pd.date_range("2013/02/03", periods=5, freq="3Min"))
In [4]: data
Out[4]:
value
2013-02-03 00:00:00 0
2013-02-03 00:03:00 1
2013-02-03 00:06:00 2
2013-02-03 00:09:00 3
2013-02-03 00:12:00 4
In [5]: filler = pd.DataFrame({"value": [100] * 15}, index=pd.date_range("2013/02/03", periods=15, freq="1Min"))
In [6]: filler
Out[6]:
value
2013-02-03 00:00:00 100
2013-02-03 00:01:00 100
2013-02-03 00:02:00 100
2013-02-03 00:03:00 100
2013-02-03 00:04:00 100
2013-02-03 00:05:00 100
2013-02-03 00:06:00 100
2013-02-03 00:07:00 100
2013-02-03 00:08:00 100
2013-02-03 00:09:00 100
2013-02-03 00:10:00 100
2013-02-03 00:11:00 100
2013-02-03 00:12:00 100
2013-02-03 00:13:00 100
2013-02-03 00:14:00 100
In [7]: merged = filler.merge(data, how='left', left_index=True, right_index=True)
In [8]: merged["value"] = np.where(np.isfinite(merged.value_y), merged.value_y, merged.value_x)
In [9]: merged
Out[9]:
value_x value_y value
2013-02-03 00:00:00 100 0 0
2013-02-03 00:01:00 100 NaN 100
2013-02-03 00:02:00 100 NaN 100
2013-02-03 00:03:00 100 1 1
2013-02-03 00:04:00 100 NaN 100
2013-02-03 00:05:00 100 NaN 100
2013-02-03 00:06:00 100 2 2
2013-02-03 00:07:00 100 NaN 100
2013-02-03 00:08:00 100 NaN 100
2013-02-03 00:09:00 100 3 3
2013-02-03 00:10:00 100 NaN 100
2013-02-03 00:11:00 100 NaN 100
2013-02-03 00:12:00 100 4 4
2013-02-03 00:13:00 100 NaN 100
2013-02-03 00:14:00 100 NaN 100
In [10]: merged['2013-02-03 00:01:00':'2013-02-03 00:10:00']
Out[10]:
value_x value_y value
2013-02-03 00:01:00 100 NaN 100
2013-02-03 00:02:00 100 NaN 100
2013-02-03 00:03:00 100 1 1
2013-02-03 00:04:00 100 NaN 100
2013-02-03 00:05:00 100 NaN 100
2013-02-03 00:06:00 100 2 2
2013-02-03 00:07:00 100 NaN 100
2013-02-03 00:08:00 100 NaN 100
2013-02-03 00:09:00 100 3 3
2013-02-03 00:10:00 100 NaN 100