python - 熊猫:保留重复时填写缺失的日期
问题描述
我有一个简单的pandas
系列:
import pandas as pd
quantities = [1, 14, 14, 11, 12, 13, 14]
timestamps = [pd.Timestamp(2015, 4, 1), pd.Timestamp(2015, 4, 1), pd.Timestamp(2015, 4, 2), pd.Timestamp(2015, 4, 3), pd.Timestamp(2015, 4, 4), pd.Timestamp(2015, 4, 5), pd.Timestamp(2015, 4, 8)]
series = pd.Series(quantities, index=timestamps)
如下所示:
2015-04-01 1
2015-04-01 14
2015-04-02 14
2015-04-03 11
2015-04-04 12
2015-04-05 13
2015-04-08 14
dtype: int64
我想填写缺失的日期,即2015-04-06 = NaN
保持2015-04-07 = NaN
系列不变,即:
2015-04-01 1
2015-04-01 14
2015-04-02 14
2015-04-03 11
2015-04-04 12
2015-04-05 13
2015-04-06 NaN
2015-04-07 NaN
2015-04-08 14
dtype: int64
我试过了:
series = series.asfreq('D')
但得到以下错误:ValueError: cannot reindex from a duplicate axis。由于重复的时间戳值而发生此错误。
地球上有什么办法可以做到这一点吗?
谢谢你的帮助。
解决方案
我们试试看:
s = pd.Series(np.nan, index=pd.date_range(series.index.min(), series.index.max(), freq='D'))
pd.concat([series,s[~s.index.isin(series.index)]]).sort_index()
输出:
2015-04-01 1.0
2015-04-01 14.0
2015-04-02 14.0
2015-04-03 11.0
2015-04-04 12.0
2015-04-05 13.0
2015-04-06 NaN
2015-04-07 NaN
2015-04-08 14.0
dtype: float64
时间:
%%timeit
temp = series[~series.index.duplicated(keep='first')].asfreq('D')
pd.concat([series, temp.loc[~temp.index.isin(series.index)]]).sort_index()
每个循环 2.51 毫秒 ± 52.7 微秒(平均值 ± 标准偏差。7 次运行,每次 100 次循环)
%%timeit
series.name = "x"
calendar = pd.DataFrame(None, index=pd.DatetimeIndex(start=series.index.min(), end=series.index.max(), freq='D'))
calendar.join(series)
C:\ProgramData\Anaconda3\lib\site-packages\ipykernel_launcher.py:2: FutureWarning: 通过传递范围端点创建 DatetimeIndex 已被弃用。改为使用
pandas.date_range
。每个循环 2.07 毫秒 ± 27.1 微秒(平均值 ± 标准偏差。7 次运行,每次 100 次循环)
%%timeit
s = pd.Series(np.nan, index=pd.date_range(series.index.min(), series.index.max(), freq='D'))
pd.concat([series,s[~s.index.isin(series.index)]]).sort_index()
每个循环 1.86 毫秒 ± 15.4 微秒(平均值 ± 标准偏差。7 次运行,每次 1000 次循环)
感谢@root 的这个建议。
%%timeit
s = pd.Series(index=pd.date_range(series.index.min(), series.index.max(), freq='D')\
.difference(series.index))
pd.concat([series,s]).sort_index()
每个循环 1.55 毫秒 ± 11.6 微秒(平均值 ± 标准偏差。7 次运行,每次 1000 次循环)
推荐阅读
- autohotkey - Regexmach,结果存储 gui 编辑框
- angular - 为什么嵌套组件无法访问继承的属性?
- node.js - socket.io 通过 nginx 返回 Transport unknown 错误
- python - 如何将字符串数据分类为整数?
- java - 在 Azure 搜索上上传文档后,我可以立即删除它吗?
- json - 长度在 Jmeter 的 JSON 提取器中不起作用
- arrays - 如何从 Firestore 的 nuxt 中的 asyncData 返回一个数组以用于 SSR?
- postgresql - Sequelize -- 将 options.distinct 与 Where 子句一起使用?
- c# - Debian 9.9 上 Visual Studio Code 中的 System.Data.SqlClient
- r - 如何将 R 数据框导出到 Power Query 表