【问题标题】:Issue with reading and combining multiple weekly csv files阅读和组合多个每周 csv 文件时出现问题
【发布时间】:2015-01-17 07:58:14
【问题描述】:

所以我有几年的每周 CSV 文件,格式为 YYmmdd:

file = 'C:\\rig-070103'

我正在尝试读取它们并将它们组合成一个数据集,最好是在一个日期范围内。到目前为止,我有:

pieces = []


for date in range(100):
    path = 'C:\\rig-YYmmdd.csv' % date
    frame = pd.read_csv(path)
    #frame['Date']= date
    pieces.append(frame)
    dataset = pd.concat(pieces, ignore_index=True)
print(dataset)

But this is giving me the error: 
path = 'C:\\rig-YYmmdd.csv' % date
TypeError: not all arguments converted during string formatting

我知道这与我如何引用每个文件有关,有什么建议吗?我还想创建另一列列出加载的每个文件的日期,因此每个文件的所有行都重复 1 个日期。非常感谢您对此的任何帮助!

以下是数据示例:

Prov    Location    LSD Section Township    Range   Meridian ...
AB  00-00-006-29W4  0   0   6   29  4
AB  01-18-008-09W4  1   18  8   9   4
AB  05-10-008-10W4  5   10  8   10  4
AB  01-12-008-12W4  1   12  8   12  4
AB  09-23-008-26W4  9   23  8   26  4
AB  13-13-009-25W4  13  13  9   25  4

【问题讨论】:

  • range(100) 只是从 0 到 100 的整数范围。您认为这些是日期吗?
  • 不,我只是在里面放了一些东西,我不确定如何创建日期时间范围
  • 看起来至少有 3 个问题合而为一。
  • 我需要查看引发错误的行。这已经变成了一个文本编码问题。将其发布到保管箱或其他东西上。

标签: python csv pandas concat import-from-csv


【解决方案1】:

所以你在这里做一些事情。一个是您需要一个日期范围,其中每个元素都是一天。那一天需要被格式化为 yymmdd。然后将 csv 拉入数据框。然后为日期添加一个列。然后将其附加到主数据框。这是一个尝试:

import pandas as pd

myDateList = pd.date_range('2003-01-01', periods=100)

myBigDf = pd.DataFrame()

for date in myDateList:
    path = 'C:\\rig-' + date.strftime('%y%m%d') + '.csv' 
    print path # show you what you got
    piece = pd.read_csv(path)
    piece['fileDate'] = date.strftime('%y%m%d')
    myBigDf.append(piece, ignore_index=True)

【讨论】:

  • 在评论中返回您的问题:我认为如果您提前更新我的行和列最终数据框将具有的方式并说myBigDf = pandas.DataFrame(index=range(n_rows), columns=list_of_columns) 然后附加到那个会更快.
  • 是的,这符合我的 R 直觉。我只是在构建一个虚拟测试来验证这一点
  • 嘿 JD,请参阅 jeff 对我的帖子的评论。显然 pandas concat 函数足够聪明,可以更快地追加到列表 (pandas.pydata.org/pandas-docs/stable/…)
【解决方案2】:

这里发生了几件事:

首先,for date in range(100) 将遍历整数 0 到 99。找不到任何日期。

接下来,path = 'C:\\rig-YYmmdd.csv' % date 无效。 假设你实际上有一个 datetime 对象,你会这样做:path = 'C:\\rig-%s.csv' % date.strftime('%y%m%d')

最后,您在每次迭代时都在写入/覆盖您的数据框。太傻了。

所以你的代码变成了

import pandas
pieces = []
columns = ['Prov', 'Objective', 'WellStatus', 'WellType']

for date in pandas.date_range('2012-01-01', periods=100):
    path = r'C:\rig-%s.csv' % date.strftime('%y%m%d')
    frame = pandas.read_csv(path, names=columns, encoding='utf-8')
    frame['date'] = date
    pieces.append(frame)

dataset = pandas.concat(pieces, ignore_index=True)
print(dataset)

【讨论】:

  • Paul,将片段放入列表比将每个位增量附加到现有 DataFrame 更可取吗?列表扩展更高效?
  • @JDLong -- 老实说,我不知道。我只是为了尽量减少对 OP 代码的影响(即缩进错误与不同的操作)。我的猜测是 pandas 最终必须循环遍历元素本身,所以你不妨按照自己的方式去做。
  • Paul,我尝试了以下代码,但出现错误:UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb0 in position 2: invalid start byte
  • 该死的。我希望有一些深刻的神奇理由来改变我的成语。由于我在 R 方面的背景,我一直想以某种方式预先分配数据帧,然后逐步添加。
  • @carevans88 你的数据有问题,试试:pandas.read_csv(path, names=columns, encoding='utf-8')
【解决方案3】:

正如回溯所示,在字符串上使用模运算符不是正确的方法。您可以使用本教程 (https://docs.python.org/2.4/lib/typesseq-strings.html) 了解如何使用它。

要获取给定日期的 yymmdd 格式的字符串,您可以使用 datetime 模块 (https://docs.python.org/2/library/datetime.html) 和 datetime.date 的“strftime”函数,如下所示:

from datetime import date 
d = date(2007, 1, 13)
filename = d.strftime("C://rig-%y%m%d.csv")
#filename will be "C://rig-070113.csv"

如果您想要连续 100 天以上的迭代,则必须使用 datetime.timedelta:

from datetime import date, timedelta
one_day = timedelta(1)
act_day = date(2007, 1, 13)
for i in range(100):
    filename = act_day.strftime("C://rig-%y%m%d.csv")
    ...
    act_day += one_day

【讨论】:

  • 你的意思是:d = date(2007, 1, 13) 2007 年 1 月 13 日
  • 尝试这个解决方案,你能详细说明...部分吗?
猜你喜欢
  • 2022-11-04
  • 1970-01-01
  • 2021-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-26
  • 1970-01-01
相关资源
最近更新 更多