【问题标题】:Changing Excel Dates (As integers) mixed with timestamps in single column - Have tried str.extract更改 Excel 日期(作为整数)与单列中的时间戳混合 - 尝试过 str.extract
【发布时间】:2021-01-19 08:33:45
【问题描述】:

我有一个包含一列日期的数据框,不幸的是我的导入(使用 read_excel)引入了日期格式作为日期时间,并将 Excel 日期作为整数。

我正在寻找的是一个日期仅格式为 %Y-%m-%d 的列

根据研究,excel 从 1900-01-00 开始,所以我可以添加这些整数。我尝试使用 str.extract 和正则表达式将列分成两列,一个是日期时间,另一个是整数。但是结果是 NaN。

这是一个输入代码示例


df = pd.DataFrame({'date_from': [pd.Timestamp('2022-09-10 00:00:00'),44476, pd.Timestamp('2021-02-16 00:00:00')], 'date_to': [pd.Timestamp('2022-12-11 00:00:00'),44455, pd.Timestamp('2021-12-16 00:00:00')]})

尝试首先通过提取整数来分隔列(从 MS excel 导入的日期)

df.date_from.str.extract(r'(\d\d\d\d\d)')

但是这给出了 NaN。

我试图将整数从列中分离出来的原因是,在尝试对混合列中的 excel 日期执行操作时出现错误(换句话说,使用以下代码会出错:)

def convert_excel_time(excel_time):

    return pd.to_datetime('1900-01-01') + pd.to_timedelta(excel_time,'D')

关于如何仅获取一列日期的任何指导?我发现 pandas 和 python 的日期时间模块和方面是最令人沮丧的!

谢谢

【问题讨论】:

    标签: pandas datetime


    【解决方案1】:

    您可以通过to_timedeltaerrors='coerce' 将值转换为时间增量,如果不是整数,则添加Timestamp 称为d,然后使用errors='coerce' 转换日期时间,最后在自定义函数中传递给Series.fillna

    def f(x):
        #https://stackoverflow.com/a/9574948/2901002
        d = pd.Timestamp(1899, 12, 30)
        timedeltas = pd.to_timedelta(x, unit='d', errors='coerce')
        dates = pd.to_datetime(x, errors='coerce')
        return (timedeltas + d).fillna(dates)
    
    cols = ['date_from','date_to']
    df[cols] = df[cols].apply(f)
    print (df)
       date_from    date_to
    0 2022-09-10 2022-12-11
    1 2021-10-07 2021-09-16
    2 2021-02-16 2021-12-16
    

    【讨论】:

    • 感谢 jezrael,但是我收到 TypeError:dtype datetime64[ns] 无法转换为 timedelta64[ns]。抱歉我看到你的编辑,让我现在试试!!
    • 仍然出现TypeError: dtype datetime64[ns] 无法转换为 timedelta64[ns]
    • @Prolle - 你的熊猫版本是什么?测试于pandas 1.1.1
    • 我的版本是1.0.5
    • 现在全部排序。升级成功了。感谢您的帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多