将一列的断点值拆分为两列

3

我有一个数据框,其中包含名为“last_updated”的列,其类型为datetime64[ns]:

df = pd.DataFrame({'last_updated': ['11/12/14 2:44 PM','5/18/15 11:36 AM','11/12/14 
3:09 PM']})

我想把这一列“last_updated_date”和“last_updated_time”分成两列。而且时间应该是24小时制。如何使用pandas完成这个任务?
2个回答

5

试试这个:

In [89]: df['last_updated_date'] = pd.to_datetime(df.last_updated).dt.normalize()

In [90]: df['last_updated_time'] = pd.to_datetime(df.last_updated).dt.time

In [91]: df
Out[91]:
       last_updated last_updated_date last_updated_time
0  11/12/14 2:44 PM        2014-11-12          14:44:00
1  5/18/15 11:36 AM        2015-05-18          11:36:00
2  11/12/14 3:09 PM        2014-11-12          15:09:00

如果你想更快地完成,并且愿意牺牲一些内存,可以按以下方式操作:

In [95]: df
Out[95]:
       last_updated
0  11/12/14 2:44 PM
1  5/18/15 11:36 AM
2  11/12/14 3:09 PM

In [96]: d = pd.to_datetime(df.last_updated)

In [97]: df['last_updated_date'] = d.dt.normalize()

In [98]: df['last_updated_time'] = d.dt.time

In [99]: del d

In [100]: df
Out[100]:
       last_updated last_updated_date last_updated_time
0  11/12/14 2:44 PM        2014-11-12          14:44:00
1  5/18/15 11:36 AM        2015-05-18          11:36:00
2  11/12/14 3:09 PM        2014-11-12          15:09:00

更新:将日期和时间列保存到Excel

为了正确存储时间,我会将时间转换为字符串/object数据类型:

df['last_updated_time'] = d.dt.strftime('%H:%M:%S')

现在我们可以将它保存到Excel中:

In [133]: writer = pd.ExcelWriter(r'd:/temp/a.xlsx', datetime_format='YYYY-MM-DD')

In [134]: df.to_excel(writer, index=False)

In [135]: writer.close()

结果 (d:/temp/a.xlsx):

在此输入图片描述


这个可以运行。我能看到正确的输出。但是当我使用to_excel函数将结果导出到Excel时,日期格式为2014-11-12 00:00:00,时间为0.614189468。 - ComplexData
@Dreamer,这有点棘手。请看这里 - MaxU - stand with Ukraine
你能根据我的要求帮我吗?我对这个还很陌生。 - ComplexData

2
您可以将日期时间列转换为字符串(日期和时间部分),在转换为24小时制后进行,如下所示:
new_cols = ['last_updated_date', 'last_updated_time']
df[new_cols] = pd.to_datetime(df['last_updated'], format='%m/%d/%y %I:%M %p')   \
                 .astype(str).str.split(expand=True)

df

Image

这将保留数值不变,同时将其导出到Excel。

last_updated_date现在以完美的格式出现,即使在一个Excel中也是如此。对于时间,有一个额外的随机数字附加在后面,我不确定它是什么。例如:14:44:25.970,11:36:39.903。 - ComplexData
1
@Dreamer,你可以试试这个:df[new_cols] = pd.to_datetime(df.last_updated).dt.strftime('%Y-%m-%d %H:%M:%S').str.split(expand=True) - MaxU - stand with Ukraine
@Dreamer,我认为这个解决方案比我的好。 - MaxU - stand with Ukraine
1
你们两个提供的解决方案都很好用。非常感谢你们! - ComplexData

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接