数据在年份级别分割不正确?

时间:2019-03-26 18:19:53

标签: python-3.x pandas

我真的对熊猫很陌生,有点迷茫,所以即使我问的不是很聪明的问题,也请谅解:)

我想计算整个数据的月平均温度(即分别每年)。我的数据包含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。我在哪里弄错了? (如果某些内容不清楚或混乱,请再次道歉。)

1 个答案:

答案 0 :(得分:0)

欢迎使用StackOverflow。看看如何创建MCVE:https://stackoverflow.com/help/mcve,这里还有一些有关创建良好的熊猫问题的好技巧:How to make good reproducible pandas examples

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