首页 > 解决方案 > 数据在年份级别上的切片不正确?

问题描述

我应该计算整个数据的月平均温度(即分别计算每年)。我的数据包含从 1952 年到 2017 年的每日温度日志:

fp = "data/1091402.txt"
data = pd.read_csv(fp, skiprows= [1], sep='\s+', na_values=['-9999'] )

data['DATE_str'] = data['DATE'].astype(str)

data['DATE_month'] = data['DATE_str'].str.slice(start=0, stop=6)

data['DATE_month'] = data['DATE_month'].astype(int)

grouped_month = data.groupby('DATE_month')

我认为预期的月数应该低于 780 个月(65 年乘以 12 个月),但它给了我 790 个月(这肯定不是真的,因为我的数据在 4 月结束)。问题实际上已经从几年开始,切片和分组后假设为 65,它给了我 66。我在哪里犯了错误?

标签: python-3.xpandas

解决方案


Pandas 提供强大的数据支持和内置的日期规则。依赖电子表格中的输入数据(您没有提供您的示例)是有风险的。因此,尝试通过将年月连接为字符串来操作索引可能不是最佳解决方案。例如,您可能有错误的日期或月份值,例如月份 0 或年份 11999。因此,将日期-月份转换为日期类型会很有帮助。

加载数据后,使用适当的索引类型对其进行跟踪,并使用 Pandas 分组器(如上所述),您可以对其应用所需的统计函数。这是一个 MCVE,您可以在自己身边运行,看看事情是如何运作的:

import pandas as pd
import random as r

daterange = pd.date_range('1952-01-01', '2018-01-01', freq='MS')
df = pd.DataFrame(index=daterange, data={'values': [r.randint(-10,110) for i in range(len(daterange))]})
print(type(df.index))
grouper = df.groupby([df.index.year, df.index.month])
print(grouper.mean())

然后可以使用石斑鱼询问关于有多少年以及几个月的问题。这就是您在上面所做的,但没有 DateTimeIndex 的帮助。

加载 csv 还可能涉及转换其中的日期。可以在此处找到该策略的一个很好的示例:Reading a csv with a timestamp column, with pandas


推荐阅读