Pandas每日平均值,Pandas.resample

7

我有一个类似于这样的csv文件

Date,Temp1,Temp2

23-Oct-09 01:00:00,21.1,22.3

23-Oct-09 04:00:00,22.3,23.8

23-Oct-09 07:00:00,21.4,21.3

23-Oct-09 10:00:00,21.5,21.6

23-Oct-09 13:00:00,22.3,23.8

23-Oct-09 16:00:00,21.4,21.3

23-Oct-09 19:00:00,21.1,22.3

23-Oct-09 22:00:00,21.4,21.3

24-Oct-09 01:00:00,22.3,23.8

24-Oct-09 04:00:00,22.3,23.8

24-Oct-09 07:00:00,21.1,22.3

24-Oct-09 10:00:00,22.3,23.8

24-Oct-09 13:00:00,21.1,22.3

24-Oct-09 16:00:00,22.3,23.8

24-Oct-09 19:00:00,21.1,22.3

24-Oct-09 22:00:00,22.3,23.8

我已经使用以下方法读取了数据:

df=pd.read_csv('data.csv', index_col=0)

并将索引转换为日期时间

df.index=pd.to_datetime(df.index)

现在我想要计算每日温度的平均值,我一直在尝试使用pd.resample如下,但是一直收到错误提示。我已经阅读了pandas.resample文档和这里的许多示例,但仍然无法解决问题...

df_avg = df.resample('D', how = 'mean')

数据错误:没有数值类型可聚合

我希望df_avg成为一个具有日期时间索引和两个列的数据框。我正在使用pandas 0.17.1和python 3.5.2,非常感谢任何帮助!

1个回答

13

您需要先将 string 列转换为 float

#add parameter parse_dates for convert to datetime first column
df=pd.read_csv('data.csv', index_col=0, parse_dates=[0])

df['Temp1'] = df.Temp1.astype(float)
df['Temp2'] = df.Temp2.astype(float)

df_avg = df.resample('D').mean()
如果 astype 返回错误,问题在于存在一些非数字值。因此,您需要使用to_numericerrors='coerce' - 这样所有“有问题”的值都会转换为NaN
df['Temp1'] = pd.to_numeric(df.Temp1, errors='coerce')
df['Temp2'] = pd.to_numeric(df.Temp2, errors='coerce')

您还可以使用布尔索引来检查所有存在问题的行:

print df[pd.to_numeric(df.Temp1, errors='coerce').isnull()]
print df[pd.to_numeric(df.Temp2, errors='coerce').isnull()]

4
请注意,这种方法已被弃用,现在应该使用df.resample('D').mean()来重新采样数据。 - pjw

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接