【问题标题】:For loop does not save changes to csv files in pythonFor循环不会将更改保存到python中的csv文件
【发布时间】:2021-07-01 13:28:22
【问题描述】:

我正在尝试更改 csv 文件中的列,以将日期和时间列合并为一个。该代码在我尝试使用没有 for 循环的特定 csv 文件时有效,但是当我尝试将代码变成循环的一部分时,它无法保存对 csv 文件的任何更改:

df = pd.read_csv('C:/Users/elsam/Documents/Year 3/Final EN3300 Project/Machine Learning/Data/locations/asp/row/noaa/data_id.csv')
pd.options.mode.chained_assignment = None
for f in [df, df2, df3, df4, df5, df6, df7, df8, df9, df10, df11, df12, df13, df14, df15, df16, df17, df18, df19, df20, df21, df23]:
    f['Date'] = f['Date'].astype(str)

    f = f.loc[(f['Date'] != '0')]

    f['year'] = f['Date'].str[:-4]
    f['month'] = f['Date'].str[-4:-2]
    f['day'] = f['Date'].str[-2:]

    f['time'] = f['time'].astype(str)

    f.loc[(f['time'] == '0'), 'time'] = '000'
    f.loc[(f['time'] == '2'), 'time'] = '002'
    f.loc[(f['time'] == '11'), 'time'] = '011'
    f.loc[(f['time'] == '20'), 'time'] = '020'
    f.loc[(f['time'] == '30'), 'time'] = '030'
    f.loc[(f['time'] == '40'), 'time'] = '040'
    f.loc[(f['time'] == '45'), 'time'] = '045'
    f.loc[(f['time'] == '46'), 'time'] = '046'
    f.loc[(f['time'] == '47'), 'time'] = '047'
    f.loc[(f['time'] == '53'), 'time'] = '053'
    f.loc[(f['time'] == '55'), 'time'] = '055'
    f.loc[(f['time'] == '56'), 'time'] = '056'
    f.loc[(f['time'] == '59'), 'time'] = '059'
    f['hour'] = f['time'].str[:-2]
    f['minute'] = f['time'].str[-2:]

    f['datetime'] = pd.to_datetime(f[['year', 'month', 'day', 'hour', 'minute']])
df.to_csv('C:/Users/elsam/Documents/Year 3/Final EN3300 Project/Machine Learning/Data/locations/asp/row/noaa/5 min NOAA.csv')

在 for 循环之前,我有一个要读取的 csv 文件列表,其格式与 df csv 文件的代码相同,在 for 循环之后,我有一个要保存的 csv 文件列表,其格式与 df csv 文件的代码相同文件如上图。但是,for 循环中的所有更改似乎都没有保存到任何 csv 文件中。我想知道为什么当 f 被 df、df2 等替换时,代码在没有 for 循环的情况下工作。

【问题讨论】:

  • 代码只显示你加载和保存df。你真的在保存其他数据帧吗?
  • 您只是将一个数据帧保存到磁盘(名为 df),这发生在您的循环之外。我认为您想遍历文件名并在循环中打开和重写每个数据帧。
  • 我正在加载并保存所有其他数据帧 df-df23。我只包含了加载和保存 df 的代码,因为加载和保存其他数据帧的代码与 df 相同,只是文件路径不同。

标签: python pandas csv for-loop


【解决方案1】:

把你的代码改成这个 -

df = pd.read_csv('C:/Users/elsam/Documents/Year 3/Final EN3300 Project/Machine Learning/Data/locations/asp/row/noaa/data_id.csv')
pd.options.mode.chained_assignment = None
for i, f in enumerate([df, df2, df3, df4, df5, df6, df7, df8, df9, df10, df11, df12, df13, df14, df15, df16, df17, df18, df19, df20, df21, df23]):
    f['Date'] = f['Date'].astype(str)

    f = f.loc[(f['Date'] != '0')]

    f['year'] = f['Date'].str[:-4]
    f['month'] = f['Date'].str[-4:-2]
    f['day'] = f['Date'].str[-2:]

    f['time'] = f['time'].astype(str)

    f.loc[(f['time'] == '0'), 'time'] = '000'
    f.loc[(f['time'] == '2'), 'time'] = '002'
    f.loc[(f['time'] == '11'), 'time'] = '011'
    f.loc[(f['time'] == '20'), 'time'] = '020'
    f.loc[(f['time'] == '30'), 'time'] = '030'
    f.loc[(f['time'] == '40'), 'time'] = '040'
    f.loc[(f['time'] == '45'), 'time'] = '045'
    f.loc[(f['time'] == '46'), 'time'] = '046'
    f.loc[(f['time'] == '47'), 'time'] = '047'
    f.loc[(f['time'] == '53'), 'time'] = '053'
    f.loc[(f['time'] == '55'), 'time'] = '055'
    f.loc[(f['time'] == '56'), 'time'] = '056'
    f.loc[(f['time'] == '59'), 'time'] = '059'
    f['hour'] = f['time'].str[:-2]
    f['minute'] = f['time'].str[-2:]

    f['datetime'] = pd.to_datetime(f[['year', 'month', 'day', 'hour', 'minute']])
    f.to_csv('C:/Users/elsam/Documents/Year 3/Final EN3300 Project/Machine Learning/Data/locations/asp/row/noaa/5 min NOAA_' + str(i) + '_'.csv')

【讨论】:

  • 谢谢您,我尝试了您的更改,但最后一行出现错误代码: Traceback(最近一次调用最后一次):文件“C:\Users\elsam\Documents\Year 3\Final EN3300 Project\Machine Learning\Code\Data Compilation.py",第 298 行,在 f.to_csv('C:/Users/elsam/Documents/Year 3/Final EN3300 Project/Machine Learning/Data/locations/asp/ row/noaa/5 min NOAA_' + i + '_.csv') TypeError: can only concatenate str (not "int") to str
  • 好的,我进行了更改。请更改代码
猜你喜欢
  • 1970-01-01
  • 2019-09-25
  • 2022-11-28
  • 1970-01-01
  • 2010-12-13
  • 2017-03-25
  • 2021-10-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多