我有一个类似于"ValueError:无法从重复轴重新索引"的问题。未提供解决方案。
我有一个包含多行和多列天气数据的 excel 文件。数据在某些时间间隔内丢失,但未显示在下面的示例中。我想以 5 分钟的间隔重新索引时间列,以便可以插值缺失值。数据示例:
Date Time Temp Hum Dewpnt WindSpd
04/01/18 12:05 a 30.6 49 18.7 2.7
04/01/18 12:10 a NaN 51 19.3 1.3
04/01/18 12:20 a 30.7 NaN 19.1 2.2
04/01/18 12:30 a 30.7 51 19.4 2.2
04/01/18 12:40 a 30.9 51 19.6 0.9
这是我尝试过的。
import pandas as pd
ts = pd.read_excel('E:DATAAP.xlsx')
ts['Time'] = pd.to_datetime(ts['Time'])
ts.set_index('Time', inplace=True)
dt = pd.date_range("2018-04-01 00:00:00", "2018-05-01 00:00:00", freq='5min', name='T')
idx = pd.DatetimeIndex(dt)
ts.reindex(idx)
我只想让我的索引频率为 5 分钟,以便以后可以插值 NaN。预期产出:
Date Time Temp Hum Dewpnt WindSpd
04/01/18 12:05 a 30.6 49 18.7 2.7
04/01/18 12:10 a NaN 51 19.3 1.3
04/01/18 12:15 a NaN NaN NaN NaN
04/01/18 12:20 a 30.7 NaN 19.1 2.2
04/01/18 12:25 a NaN NaN NaN NaN
04/01/18 12:30 a 30.7 51 19.4 2.2
另一种方法。
df['Time'] = pd.to_datetime(df['Time'])
df = df.set_index(['Time']).resample('5min').last().reset_index()
df['Time'] = df['Time'].dt.time
df
输出
Time Date Temp Hum Dewpnt WindSpd
0 00:05:00 4/1/2018 30.6 49.0 18.7 2.7
1 00:10:00 4/1/2018 NaN 51.0 19.3 1.3
2 00:15:00 NaN NaN NaN NaN NaN
3 00:20:00 4/1/2018 30.7 NaN 19.1 2.2
4 00:25:00 NaN NaN NaN NaN NaN
5 00:30:00 4/1/2018 30.7 51.0 19.4 2.2
6 00:35:00 NaN NaN NaN NaN NaN
7 00:40:00 4/1/2018 30.9 51.0 19.6 0.9
如果必须重新采样多个日期的时间,则可以使用以下代码。
但是,稍后必须分隔"日期"和"时间"列。
df1['DateTime'] = df1['Date']+df1['Time']
df1['DateTime'] = pd.to_datetime(df1['DateTime'],format='%d/%m/%Y%I:%M %p')
df1 = df1.set_index(['DateTime']).resample('5min').last().reset_index()
df1
输出
DateTime Date Time Temp Hum Dewpnt WindSpd
0 2018-01-04 00:05:00 4/1/2018 12:05 AM 30.6 49.0 18.7 2.7
1 2018-01-04 00:10:00 4/1/2018 12:10 AM NaN 51.0 19.3 1.3
2 2018-01-04 00:15:00 NaN NaN NaN NaN NaN NaN
3 2018-01-04 00:20:00 4/1/2018 12:20 AM 30.7 NaN 19.1 2.2
4 2018-01-04 00:25:00 NaN NaN NaN NaN NaN NaN
5 2018-01-04 00:30:00 4/1/2018 12:30 AM 30.7 51.0 19.4 2.2
6 2018-01-04 00:35:00 NaN NaN NaN NaN NaN NaN
7 2018-01-04 00:40:00 4/1/2018 12:40 AM 30.9 51.0 19.6 0.9
例如,您可以尝试以下操作:
import pandas as pd
ts = pd.read_excel('E:DATAAP.xlsx')
ts['Time'] = pd.to_datetime(ts['Time'])
ts.set_index('Time', inplace=True)
ts.resample('5T').mean()
更多信息请见:https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.resample.html
将"时间"列设置为索引,确保它是日期时间类型,然后尝试
ts.asfreq('5T')
用
ts.asfreq('5T', method='ffill')
以向前拉取以前的值。
我会采取创建一个空白表的方法,并用来自数据源的数据填充它。对于此示例,三个观测值作为 NaN 读入,并且缺少 1:15 和 1:20 的行。
import pandas as pd
import numpy as np
rawpd = pd.read_excel('raw.xlsx')
print(rawpd)
Date Time Col1 Col2
0 2018-04-01 01:00:00 1.0 10.0 1 2018-04-01 01:05:00 2.0 NaN 2 2018-04-01 01:10:00 NaN 10.0 3 2018-04-01 01:20:00NaN
10.0 4 2018-04-01 01:30:00 5.0 10.0
现在创建一个具有理想结构的数据帧 targpd。
time5min = pd.date_range(start='2018/04/1 01:00',periods=7,freq='5min')
targpd = pd.DataFrame(np.nan,index = time5min,columns=['Col1','Col2'])
print(targpd)
Col1 Col2
2018-04-01 01:00:00 NaN NaN 2018-04-01 01:05:00 NaN 2018-04-01 01:10:00 NaN NaN 2018-04-01 01:15:00 NaN 2018-04-01 01:20:00 NaN NaN 2018-04-01 01:25:00 NaN
2018-04-01 01:30:00 NaN
现在的诀窍是使用rawpd中发送给您的数据更新targpd。为此,必须在 rawpd 中组合日期和时间列并制作成索引。
print(rawpd.Date,rawpd.Time)
0 2018-04-01 1 2018-04-01 2 2018-04-01 3 2018-04-01
4 2018-04-01 名称:日期
,d类型:日期时间64[ns] 0 01:00:00 1 01:05:00 2 01:10:00 3 01:20:00
4 01:30:00
名称:时间,dtype:对象
您可以在上面看到这一切的诀窍。您的日期数据已转换为日期时间,但您的时间数据只是一个字符串。下面是通过使用lambda函数创建的适当索引。
rawidx=rawpd.apply(lambda r : pd.datetime.combine(r['Date'],r['Time']),1)
print(rawidx)
这可以作为索引应用于 rawpd 数据库。
rawpd2=pd.DataFrame(rawpd[['Col1','Col2']].values,index=rawidx,columns=['Col1','Col2'])
rawpd2=rawpd2.sort_index()
print(rawpd2)
一旦到位,更新命令就可以得到你想要的。
targpd.update(rawpd2,overwrite=True)
print(targpd)
Col1 Col2
2018-04-01 01:00:00 1.0 10.0 2018-04-01 01:00:00 1.0 10.0 2018-04-01 01:05:00 2.0 NaN 2018-04-01 01:10:00 NaN 10.0 2018-04-01 01:15:00 NaN 2018-04-01 01:20:00 NaN 10.0 2018-04-01 01:25:00 NaN 2018-04-01 01:30:00 5.0 10.0 2018-04-01 01:05:00 2.0 NaN 2018-04-01 01:10:00 NaN
10.0 2018-04-01 01:20:00 NaN 10.0
2018-04-01 01:25:00 NaN
2018-04-01 01:30:00 5.0 10.0
现在,您已准备好进行插值
我已经让它工作了。 谢谢大家抽出时间。我正在提供工作代码。
import pandas as pd
df = pd.read_excel('E:DATAAP.xlsx', sheet_name='Sheet1', parse_dates=[['Date', 'Time']])
df = df.set_index(['Date_Time']).resample('5min').last().reset_index()
print(df)