【问题标题】:Fixing dates in pandas dataframe修复熊猫数据框中的日期
【发布时间】:2017-12-01 21:40:41
【问题描述】:

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

【问题讨论】:

  • 没有任何数据框示例,尚不清楚问题所在。我理解的方式是您的excel文件中的日期字符串以不同的格式保存?
  • 使用每个日期值的最后一位,检查它是否大于或等于1900。如果是这样,则表明格式为%d%m%Y。否则你的格式是%Y%m%d。这只是我对您提供的示例的观察。
  • @kwant 感谢您的评论。我的源文件通常将日期作为列标题(例如 2017 年 10 月 12 日或 2017 年 10 月 12 日,有一些细微差别,但仍然是日期)。在某些源文件中,标头是字符串(例如 20171012 或 12102017)。这适用于这些文件中的所有列标题,所以我试图找到一种将其作为循环执行的方法,而不引用每个值。抱歉,我无法比这更好地解释它。
  • @Abdou 感谢您的评论。问题不仅在于找出字符串是 20171012 还是 12102017,还在于能够将每个字符串列标题)更改为日期格式,例如 2017/10/12 或类似的。
  • 检查pd.to_datetime

标签: python excel pandas datetime dataframe


【解决方案1】:

你可以试试this。它可能会解决您的问题,因为它可以解释多种书写日期的方式。

columns = df.columns
rename_cols = {}
for col in columns:
    rename_cols[col] = parse(col)

df.rename(columns=rename_cols, axis=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
    

    【讨论】:

    • 感谢您的回答。我使用了建议的代码,但出现“未知字符串格式错误”。是否可以在加入所有数据帧之前转换每个数据帧的每一列?
    • 我不明白你的意思? DataFrames 没有加入,对它们的引用只是保存在一个列表中,就像在你的例子中一样。
    • 是的,我只是想知道是否可以直接在每个数据帧中进行(没有循环),而不是我想这样做,这只是为了提供信息。关于错误,有没有办法修复它?
    • to_datetime 在遇到无法正确解析的字符串时会引发 ValueError。我稍微更改了代码,以便您更轻松地诊断此问题
    • 您查看文档了吗? start_dir = Path("C:\\","Users\\DGMS\\Desktop\\final 2")
    猜你喜欢
    • 1970-01-01
    • 2022-06-22
    • 2020-01-14
    • 2021-10-21
    • 1970-01-01
    • 2017-05-16
    • 1970-01-01
    • 2021-07-25
    • 1970-01-01
    相关资源
    最近更新 更多