python-3.x - 数据在年份级别上的切片不正确?
问题描述
我应该计算整个数据的月平均温度(即分别计算每年)。我的数据包含从 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。我在哪里犯了错误?
解决方案
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
推荐阅读
- youtube - youtube 实时聊天节目仅在桌面上 - 在移动设备上什么都看不到
- dashboard - 在超集仪表板中定位图表的问题
- ionic-framework - 如何根据通过蓝牙从 arduino 收到的数据浏览 ionic 应用程序
- powershell - 为什么我不能在 write-host 中使用 $_?
- c# - (A) 等待类完成实例化
- angular - 如何对 Angular @Input 的 setter 和 getter 进行单元测试
- anaconda - 无法创建新的 jupyter 笔记本。POST 中缺少错误“_xsrf”参数
- jekyll - 如何从 _config.yml 中的另一个变量创建 Jekyll 变量?
- r - 我如何计算一列中的值数量并将其写入 R 的新列中?
- c# - EventSystem 误解了按钮点击