gpt4 book ai didi

python - 如何在Python中将日期列从对象类型转换为日期类型

转载 作者:行者123 更新时间:2023-12-01 09:26:07 25 4
gpt4 key购买 nike

我有这个数据框,其中日期列是“datetime”类型

datetime64[ns]
2014-04-30T00:00:00 000000000

现在我想要这种格式的日期 - 2014-04-30 。所以我使用了下面的代码

df['StartingDate2'] = XY['StartingDate'].dt.strftime('%m/%d/%Y')

现在,这可以准确地工作,但会将我的日期转换为对象类型。我读过here在Python中,日期是对象。但我想将最终的数据框写为 redshift 中的表格,因此我需要将日期列定义为 python 数据框的日期。任何有关如何做到这一点的建议,我们将不胜感激。

<小时/>

更新:

示例数据框

p1 = {'name': ['johnny', 'tommy', 'bobby', 'rocky', 'jimmy'], 'StartingDate': ['2015-07-14T00:00:00.000000000', '2013-10-30T00:00:00.000000000', '2014-04-30T00:00:00.000000000', '2014-01-27T00:00:00.000000000', '2016-01-15T00:00:00.000000000'], 'Address': ['NY', 'NJ', 'PA', 'NY', 'CA'], 'comment1': ['Very good performance', 'N/A', 'Need to work hard', 'No Comment', 'Not satisfactory'], 'comment2': ['good', 'Meets Expectation', 'N', 'N/A', 'Incompetence']}
XY = pd.DataFrame(data = p1)
XY['today'] = datetime.datetime.now()

当我使用 to_datetime() 解决方案时 - 它不起作用

XY['today2'] = pd.to_datetime(XY['today'],  format = '%m/%d/%Y')
XY['StartingDate2'] = pd.to_datetime(XY['today'], format = '%m/%d/%Y')

或者 - 当 strftime() 和 to_datetime() 组合使用时,这也有效。

XY['StartingDate2'] = XY['StartingDate2'].dt.strftime('%m/%d/%Y')
XY['StartingDate2'] = pd.to_datetime(XY['StartingDate2'])

但是,虽然这个解决方案适用于示例数据,但对我来说不起作用。我的数据看起来像这样 -

array(['2015-09-29T14:34:39.000000000', '2015-10-07T14:13:03.000000000',
'2015-10-07T19:17:50.000000000', ...,
'2017-12-05T14:06:42.000000000', '2017-12-06T16:36:44.000000000',
'2017-12-06T18:26:49.000000000'], dtype='datetime64[ns]'

最佳答案

解决方案是使用 to_datetime

s = pd.Series(['3/11/2000', '3/12/2000', '3/13/2000'])
s
0 3/11/2000
1 3/12/2000
2 3/13/2000
dtype: object

pd.to_datetime(s)
0 2000-03-11
1 2000-03-12
2 2000-03-13
dtype: datetime64[ns]

所以根据你的情况,你可以写

df['StartingDate2'] = pd.to_datetime(XY['StartingDate'], format='%m/%d/%Y')

事实上你可以忽略这里的格式关键字。但如果你提供它,你将获得巨大的速度提升。

基准

s = pd.Series(['3/11/2000', '3/12/2000', '3/13/2000']*1000)

无格式

%%timeit
pd.to_datetime(s)
453 ms ± 3.05 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

有格式

%%timeit
pd.to_datetime(s, format='%m/%d/%Y')
9.68 ms ± 44.3 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

请注意:如果可能,请始终提供格式字符串

回答更新的问题

您可以使用日期时间floor功能

df = pd.DataFrame(pd.to_datetime(['2015-09-29T14:34:39.000000000', '2015-10-07T14:13:03.000000000',
'2015-10-07T19:17:50.000000000',
'2017-12-05T14:06:42.000000000', '2017-12-06T16:36:44.000000000',
'2017-12-06T18:26:49.000000000']), columns=['A'])

df['B'] = df['A'].dt.floor('d')
df.dtypes

A datetime64[ns]
B datetime64[ns]
dtype: object

df

A B
0 2015-09-29 14:34:39 2015-09-29
1 2015-10-07 14:13:03 2015-10-07
2 2015-10-07 19:17:50 2015-10-07
3 2017-12-05 14:06:42 2017-12-05
4 2017-12-06 16:36:44 2017-12-06
5 2017-12-06 18:26:49 2017-12-06

关于python - 如何在Python中将日期列从对象类型转换为日期类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50380203/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com