【问题标题】:Adding values of column b when filtering on values of column a过滤列 a 的值时添加列 b 的值
【发布时间】:2018-04-01 18:06:14
【问题描述】:

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

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

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

例如,添加值 20160131

【问题讨论】:

  • 你有代码要显示吗?如果我们看不到它,很难改进它。我在这里也遗漏了一个具体的问题,看起来更像是在宣扬一些好的意图。
  • 你尝试过什么吗?什么部分阻碍了你?读取 CSV 文件?过滤列表?求和值?
  • 您使用的是 numpy 还是 pandas,还是您的数据在常规 Python 列表中?
  • 我的困难是过滤这个列表。我能够读取 CSV 值。
  • 日期是row[0] 转换为int

标签: python python-3.x csv datetime


【解决方案1】:

又快又脏,但是很管用。

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)

【讨论】:

  • 感谢您的帮助奥拉夫!对此,我真的非常感激。我正在做我的一个项目,这真的很有帮助!
  • 很高兴我的回答对您有所帮助:) 如果您还有其他与 python 相关的问题,请随时提问
【解决方案2】:

这是使用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() 来返回数据框而不是系列。

【讨论】:

    猜你喜欢
    • 2022-01-03
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-05
    • 1970-01-01
    相关资源
    最近更新 更多