【问题标题】:Formatting Date To MM/DD/YYY From xlsb File从 xlsb 文件将日期格式化为 MM/DD/YYYY
【发布时间】:2019-03-27 23:12:48
【问题描述】:

我有一个 .xlsb 文件,我想使用 pandas 进行分析。我找到了如何使用 pyxlsb 打开文件并创建另一个数据集。但是,现在的问题是时间格式已更改为不同的数字格式(例如 41256)。

我现在使用的代码是:

dataset = []

with open_xlsb(file) as wb: #opening an xlsb file workbook
    with wb.get_sheet(1) as sheet1:
        for row in sheet1.rows():
            dataset.append([item.v for item in row])

dataset= pd.DataFrame(dataset[1:], columns=dataset[0])

我已经尝试过如下的convert_date:

convert_date(dataset)

我也尝试过 to_datetime 函数,但不确定我是否正确使用它。作为参考,我正在使用的数据集在多列和多行中有日期,所以我正在寻找一种方法将它们全部转换为正确的格式,同时忽略任何错误。

编辑:所以我没有包含“日期”的单列,而是有多个列,例如 StartDate、EndDate、Last Updated 和其他一些列。我想看到的结果是,如果我转到一个列,例如 dataset.columns['StartDate'],我想获得一个日期值,例如 15/03/2019,而不是 42156。

任何帮助将不胜感激!

【问题讨论】:

  • 您在寻找pandas 特定的解决方案吗?如果没有,我相信你可以通过 datetime 模块完成此操作
  • 这里的预期输出是什么?您的标题和问题内容不太相符。
  • 这是一个推测的骗局,因为我不确定在库之间转换的确切日期格式(将数字输入转换为日期格式)
  • 你的标题是“MM/DD/YYY”。你真的不想要一个 3 位数的年份,是吗? (如果您的要求允许,请考虑使用 ISO-8601 格式“YYYY-MM-DD”。xkcd.com/1179

标签: python pandas date


【解决方案1】:

由于this answer,我遇到了类似的问题。

尝试datetime模块中的函数datetime.fromordinal如下:

from datetime import datetime


# for integers
def convert_int_date(ordinal_date):
    date_time = datetime.fromordinal(
        datetime(1900, 1, 1).toordinal() + ordinal_date - 2
    )
    return date_time

dataset["StartDate"] = dataset["StartDate"].astype(int).apply(convert_int_date)

然后您可以随意格式化您的日期。

dataset["StartDate"] = dataset["StartDate"].dt.strftime("%m/%d/%Y")

在我的特殊情况下,每个日期都由一个整数给出。没有考虑小时、分钟和秒。如果您确实需要考虑这些(或者如果您有一个浮点数作为日期),请尝试以下操作:

# for floats
def convert_float_date(ordinal_date):
    hours, r = divmod(ordinal_date, 1)
    minutes, r = divmod(r*60, 1)
    seconds = r*60

    date_time = datetime.fromordinal(
        datetime(1900, 1, 1).toordinal() + ordinal_date - 2
    )
    datetime = date_time.replace(hour=hours, minute=minutes, second=seconds)
    return date_time

dataset["StartDate"] = dataset["StartDate"].astype(float).apply(convert_float_date)

Credits

【讨论】:

    【解决方案2】:

    假设您的日期列是“日期”,命令将是这样的:

    dataset['Date'] = pd.to_datetime(dataset['Date'], format='%m/%d/%Y')
    

    【讨论】:

    • 这只完成了一半的工作。现在你有了一个日期时间对象,而不是格式化字符串
    • 其实,这个问题还不清楚。标题读起来好像他们想要一个来自strftime的字符串,基本上
    • 我没有看到 OP 说他想要一个字符串。他说他希望日期格式为 MM/DD/YYYY。
    • 标题中暗示了,但我要求澄清。
    • 您的编辑:您的答案的输出不会是这样的输出。 to_datetimeformat 参数是告诉 pandas 如何将其从字符串out 解析为 datetime 对象。如果您仅执行此步骤,它将不会以指定的格式打印或写回。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-18
    • 2012-12-20
    • 1970-01-01
    • 2015-11-03
    • 1970-01-01
    • 1970-01-01
    • 2018-09-01
    相关资源
    最近更新 更多