如何将日期时间转换为日期?

1007

如何在Python中将datetime.datetime对象(例如,datetime.datetime.now()的返回值)转换为datetime.date对象?


40
如果你只需要获取当前时间,可以使用方法datetime.date.today()代替datetime.datetime.now()。请注意,这两种方法的意义不同。 - Thierry J.
如果您已经导入了datetime模块,例如from datetime import datetime,那么您可以添加date模块,即from datetime import datetime, date - Josh
10个回答

1534

使用 date() 方法:

datetime.datetime.now().date()

24
要获取协调世界时(UTC)的时间,可以非常有帮助使用以下代码:datetime.datetime.utcnow(),对应的日期则为 datetime.datetime.utcnow().date() - Nick Brady
3
感谢@SeanColombo,特定时区的当前日期应为datetime.datetime.now(pytz.timezone('US/Pacific')).date() - Monica For CEO
4
datetime.datetime.utcnow()已经被弃用,请参考https://docs.python.org/3/library/datetime.html#datetime.datetime,使用datetime.now(timezone.utc)替代。实际上,OP想要的是日期,因此这个问题无关紧要。 - hum3
2
假设使用时区具有非零偏移量的 from datetime import datetime, date, timezone,则 datetime.now(timezone.utc).date() 可能与 datetime.now().date()(后者也可用作 date.today())不同。 - tzot

166

77
你可以使用 datetime.datetime.date() 方法:
datetime.datetime.now().date()

显然,上面的表达式可以(而且在我看来应该 :) 写成:

datetime.date.today()

2
公平地说,这个答案(使用.today())对于所述的示例问题来说是最具Python风格的。 - Dannid
2
如果您使用“today()”函数来比较日期,请注意。该函数还包含一个“hour”组件。因此,如果您执行以下操作:losdat = datetime.datetime.strptime(losdatstr, '%d%m%Y'),然后再执行 if losdat < datetime.datetime.today():,结果将始终为真,因为“losdat”将具有午夜的时间组件,这将早于“today()”函数的时间戳。 - DDecoene
6
当需要一个 datetime.date 对象时,为什么要使用 datetime.datetime.today() 而不是 datetime.date.today() - tzot
@tzot 是的,这也是我想指出的,但表达不够清楚。 - DDecoene

63
你可以使用日期时间对象的date()方法将日期时间对象转换为日期,方法如下:
<datetime_object>.date()

12

你可以输入以下代码以获取(今天的日期和星期几以及小时)datetime.datetime.now().strftime('%y-%m-%d %a %H:%M:%S')

'19-09-09 Mon 17:37:56'

并输入以下代码以获取(仅今天的日期)datetime.date.today().strftime('%y-%m-%d') '19-09-10'

对于对象: datetime.datetime.now().date() datetime.datetime.today().date() datetime.datetime.utcnow().date() datetime.datetime.today().time() datetime.datetime.utcnow().date() datetime.datetime.utcnow().time()


OP想要获取datetime.date对象,而不是strftime返回的字符串(参考:https://docs.python.org/3/library/datetime.html#datetime.date.strftime)。 - Grzegorz Skibinski

11

答案已更新到Python 3.7及更高版本

以下是如何将日期时间对象

(也称为datetime.datetime对象,该对象存储在models.DateTimeField django模型字段中)

转换为日期对象(即datetime.date对象):

from datetime import datetime

#your date-and-time object
# let's supposed it is defined as
datetime_element = datetime(2020, 7, 10, 12, 56, 54, 324893)

# where
# datetime_element = datetime(year, month, day, hour, minute, second, milliseconds)

# WHAT YOU WANT: your date-only object
date_element = datetime_element.date()

只是为了明确起见,如果您打印这些元素,以下是输出结果:

print(datetime_element)

2020年7月10日 12点56分54.324893秒

print(date_element)

2020年7月10日


6
import time
import datetime

# use mktime to step by one day
# end - the last day, numdays - count of days to step back
def gen_dates_list(end, numdays):
  start = end - datetime.timedelta(days=numdays+1)
  end   = int(time.mktime(end.timetuple()))
  start = int(time.mktime(start.timetuple()))
  # 86400 s = 1 day
  return xrange(start, end, 86400)

# if you need reverse the list of dates
for dt in reversed(gen_dates_list(datetime.datetime.today(), 100)):
    print datetime.datetime.fromtimestamp(dt).date()

3
你是不是想在这里发布这个答案?在我看来,你的回答似乎是针对另一个问题的。请确认一下是否贴错了。 - Uyghur Lives Matter

1
Solved: AttributeError: 'Series' object has no attribute 'date'

您可以如下使用:
df["date"] = pd.to_datetime(df["date"]).dt.date

在上面的代码中,date包含日期和时间(2020-09-21 22:32:00),使用上述代码,我们只能得到日期(2020-09-21)。

0

我使用lambda和data.strftime('%y-%m-%d')将列转换为日期


-3
如果您正在使用pandas,那么这可以解决您的问题:
假设您的数据框中有一个名为start_time的datetime64类型变量,那么您可以像这样获取日期部分:
df.start_time.dt.date

2
我认为这个问题不是关于pandas的。 - NameVergessen
你说得对,我在解决这个问题时想到了pandas。 - Orn Arnar
1
把这篇文章删除或者澄清一下不是更合理吗?这样很容易让人误解。 - NameVergessen

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