将pandas datframe列转换为具有特定日期格式的日期类型吗?

时间:2019-12-05 06:41:28

标签: python pandas datetime

此问题不同于堆栈溢出中所有可用的问题和答案,因为我不想将数据类型更改为字符串以获得所需的输出。

我觉得这是最令人困惑的,无法找到解决我问题的适当方法。 我读了一个Excel文件,其中有以下一列-

Date
9/20/2017 7:27:30 PM
9/20/2017 7:27:30 PM
11/21/2018 8:28:30 AM
7/18/2019 9:30:08 PM
.
.
.

我正在借助dataframe从excel工作表中获取数据

df = pd.read_excel("data.xlsx") 

首先,我想从此列中删除时间。我这样做是-

df['Date'] = pd.to_datetime(df['Date'])
df['Date'] = pd.to_datetime(df['Date'], errors='ignore', format='%d/%b/%Y').dt.date

它产生以下输出和数据类型为datetime.date

Date
20/9/2017 
20/9/2017 
21/11/2018 
18/7/2019 
.
.
.

但是我希望将其作为以下类型而不将其更改为字符串。因为我想将此数据存储到另一个excel文件中,并且如果我们在excel工作表中应用过滤,则此列必须表现为日期列。

Date
20/Sep/2017
20/Sep/2017
21/Nov/2018
18/Jul/2019
.
.
.

我可以通过以下方式产生以上输出

df['Date'] = df['Date'].apply(lambda x: x.strftime('%d/%b/%Y'))

但是再次将这个日期列更改为字符串。但是我不希望它作为字符串。我希望它作为datetime类型,但不包括每个单元格中的时间值。 将其从字符串转换为日期时间后,可能的解决方案如下,但它将再次在其中添加时间值-

df['Date'] = pd.to_datetime(df['Date'])

执行上述两个步骤后,还将包括时间12:00:00 AM或00:00:00 AM以及日期值。

希望我很清楚。 如何获得以最终列值作为日期类型的期望结果

2 个答案:

答案 0 :(得分:0)

您可以在excelwriter中设置date_format

writer = pd.ExcelWriter("pandas_datetime.xlsx",
                        engine='xlsxwriter',
                        date_format='%d/%b/%Y')
df.to_excel(writer)

答案 1 :(得分:0)

  

但是我希望它具有以下类型,而无需将其更改为字符串

不可能,如果想要没有时间的日期时间,则python / pandas中只有模式YYYY-MM-DD

#datetimes with no times
df['Date'] = pd.to_datetime(df['Date'], format='%m/%d/%Y %I:%M:%S %p').dt.floor('d')
#python dates
df['Date'] = pd.to_datetime(df['Date'], format='%m/%d/%Y %I:%M:%S %p').dt.date

对于所有自定义格式,日期时间都将转换为以下字符串:

df['Date'] = df['Date'].dt.strftime('%d/%b/%Y')