场景:我正在使用python代码从excel文件中提取数据。目前,我的代码将每个文件读入单个数据帧,并将它们连接到数据帧列表中。
问题:原始的Excel源文件按列(日期)和标识符(行)进行组织。其中一些文件具有字符串格式的日期,例如20170611或11062015。
到目前为止我尝试了什么:从之前的SO研究中,我发现了一些有关此主题的问题和答案,但它们都提到了一次转换,例如:
datetime.datetime.strptime('24052010', "%d%m%Y").date()
datetime.date(2010, 5, 24)
这是我需要的那种操作,但是我想在循环中对受影响文件的所有列标题执行它。
问题:是否可以这样做?怎么办呢?
Obs:我考虑使用一些代码循环遍历excel文件以选择受影响的代码,但由于我不知道如何操作,我将手动选择文件并将它们单独修复。所以我的目标只是循环列并修复这些文件的日期。
从excel获取数据的当前代码:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import glob, os
import datetime as dt
from datetime import datetime
import matplotlib as mpl
directory = os.path.join("C:\\","Users\\DGMS\\Desktop\\final 2")
list_of_dfs = []
for root,dirs,files in os.walk(directory):
for file in files:
f = os.path.join(root, file)
print(f)
list_of_dfs .append(pd.read_excel(f))
答案 0 :(得分:2)
您可以尝试this。它可以解决您的问题,因为它可以解释几种写日期的方式。
columns = df.columns
rename_cols = {}
for col in columns:
rename_cols[col] = parse(col)
df.rename(columns=rename_cols, axis=1)
答案 1 :(得分:2)
您可以使用pandas.to_datetime
。它推断出日期时间格式是合理的猜测。如果所有具有背面年份的格式首先具有日期(而不是月份),则可以使用dayfirst=True
参数
我也更喜欢pathlib.Path.glob
而不是os.walk
我会做这样的事情
from pathlib import Path
start_dir = Path('.')
excel_files = start_dir.glob('*/*.xlsx')
list_of_dfs = [(filename, pd.read_excel(filename, header=0, dayfirst=True)) for filename in excel_files]
for filename, df in list_of_dfs:
try:
datetimes = pd.to_datetime(df.columns)
df.columns = datetimes
except ValueError:
print('failed to parse column in %s' % filename