在对列a的值进行过滤时添加列b的值

时间:2018-04-01 18:06:15

标签: python python-3.x csv datetime

我有一个有两列的长csv文件。我的第一列有一个表示日期的整数,第二列有另一个表示温度的整数。它的外观如下:

  • 20160101 30
  • 20160102 32
  • 20160103 45
  • ...
  • 20171231 28

如何通过过滤整数值来添加第二列的值?

例如,添加值20160131< x< 20160301查找2016年2月所有气温的总和。

2 个答案:

答案 0 :(得分:0)

以下是使用pandas的一种方法。您可以将系列转换为datetime,然后执行groupby操作。

import pandas as pd

df = pd.DataFrame({'Date': [20160101, 20160102, 20160103, 20171231],
                   'Value': [30, 32, 45, 28]})

# or to read from csv
df = pd.read_csv('file.csv', header=None, names=['Date', 'Value'])

df['Date'] = pd.to_datetime(df['Date'], format='%Y%m%d')

res = df.set_index('Date').groupby(pd.Grouper(freq='M'))['Value'].sum().dropna()

# Date
# 2016-01-31    107.0
# 2017-12-31     28.0
# Name: Value, dtype: float64

您可能希望删除不在范围内的月份的空值。

此外,您可能希望应用.reset_index()来返回数据集而不是系列。

答案 1 :(得分:0)

快速又脏,但有效。

import csv

def filter_csv(start_date, end_date, csvfile):
    spamreader = csv.reader(csvfile, delimiter=' ', quotechar='|')
    total_temp = 0
    for row in spamreader:
        values = row[0].split(',')
        if start_date <= int(values[0]) <= end_date:
            total_temp += int(values[1])
    return total_temp

with open('d.csv', newline='') as csvfile:
    total_temp = filter_csv(20160101, 20160102, csvfile)
    print(total_temp)