Pandas 更改Excel日期(作为整数)并在单个列中混合时间戳-已尝试str.extract

Pandas 更改Excel日期(作为整数)并在单个列中混合时间戳-已尝试str.extract,pandas,datetime,Pandas,Datetime,我有一个带有日期列的数据框,不幸的是,我的导入(使用read_excel)将日期格式设置为datetime,也将excel日期设置为整数 我要查找的是一列,其日期格式仅为%Y-%m-%d 根据研究,excel从1900-01-00开始,所以我可以添加这些整数。我尝试使用str.extract和regex将列分成两个,一个是datetime,另一个是整数。然而,结果是南安 下面是一个输入代码示例 df = pd.DataFrame({'date_from': [pd.Timestamp('202

我有一个带有日期列的数据框,不幸的是,我的导入(使用read_excel)将日期格式设置为datetime,也将excel日期设置为整数

我要查找的是一列,其日期格式仅为%Y-%m-%d

根据研究,excel从1900-01-00开始,所以我可以添加这些整数。我尝试使用str.extract和regex将列分成两个,一个是datetime,另一个是整数。然而,结果是南安

下面是一个输入代码示例


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导入的日期)来分隔列

然而,这给了南

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

关于如何只获取一列日期,有什么指导吗?我发现pandas和python的datetime模块和方面是最令人沮丧的


感谢对于
NaT
您可以通过使用
errors='improve'
将值转换为timedelta,如果不是整数,请添加
Timestamp
调用的
d
,然后使用
errors='improve'
转换日期时间,并在自定义函数中最后传递到:

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:DtypeDateTime64[ns]无法转换为timedelta64[ns]。抱歉,我看到了你的编辑,现在让我试试!!仍然gettingTypeError:dtype datetime64[ns]无法转换为timedelta64[ns]@Prolle-您的版本是什么?在
pandas 1.1.1
中测试,我的版本是1.0.5,现在全部排序。升级成功了。谢谢你的帮助
def convert_excel_time(excel_time):

    return pd.to_datetime('1900-01-01') + pd.to_timedelta(excel_time,'D')
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