修复pandas数据框中的日期

时间:2017-06-28 13:29:12

标签: python excel pandas datetime dataframe

场景:我正在使用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))

2 个答案:

答案 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