如何从日期时间中删除秒?

Posted

技术标签:

【中文标题】如何从日期时间中删除秒?【英文标题】:How to remove seconds from datetime? 【发布时间】:2017-09-09 07:01:30 【问题描述】:

我有以下日期,我尝试了以下代码,

df['start_date_time'] = ["2016-05-19 08:25:00","2016-05-19 16:00:00","2016-05-20 07:45:00","2016-05-24 12:50:00","2016-05-25 23:00:00","2016-05-26 19:45:00"]
df['start_date_time'] = pd.to_datetime([df['start_date_time']).replace(second = 0)

我收到以下错误:

TypeError: replace() got an unexpected keyword argument 'second'

【问题讨论】:

你可以试试:df.index.map(lambda t: t.strftime('%Y-%m-%d %H:%M')) 您想要stringdatetime 对象吗?如果您只想要字符串,您可以使用正则表达式 ':\d\d$' 删除尾随秒数。 我想把它作为一个日期时间对象 查看这个 SO 问题:***.com/questions/24025552/… 密切相关:***.com/questions/28773342/… 【参考方案1】:

如果需要日期时间在输出中的解决方案:

df = pd.DataFrame('start_date_time': ["2016-05-19 08:25:23","2016-05-19 16:00:45"])
df['start_date_time'] = pd.to_datetime(df['start_date_time'])
print (df)
       start_date_time
0  2016-05-19 08:25:23
1  2016-05-19 16:00:45

按分钟使用Series.dt.floor TMin

df['start_date_time'] = df['start_date_time'].dt.floor('T')

df['start_date_time'] = df['start_date_time'].dt.floor('Min')

您可以先使用转换为numpy values,然后通过转换为<M8[m] 截断seconds,但此解决方案会删除可能的时区:

df['start_date_time'] = df['start_date_time'].values.astype('<M8[m]')
print (df)
      start_date_time
0 2016-05-19 08:25:00
1 2016-05-19 16:00:00

另一种解决方案是从second 创建timedelta 系列并减去:

print (pd.to_timedelta(df['start_date_time'].dt.second, unit='s'))
0   00:00:23
1   00:00:45
Name: start_date_time, dtype: timedelta64[ns]

df['start_date_time'] = df['start_date_time'] - 
                        pd.to_timedelta(df['start_date_time'].dt.second, unit='s')
print (df)
      start_date_time
0 2016-05-19 08:25:00
1 2016-05-19 16:00:00

时间安排

df = pd.DataFrame('start_date_time': ["2016-05-19 08:25:23","2016-05-19 16:00:45"])
df['start_date_time'] = pd.to_datetime(df['start_date_time'])

#20000 rows
df = pd.concat([df]*10000).reset_index(drop=True)


In [28]: %timeit df['start_date_time'] = df['start_date_time'] - pd.to_timedelta(df['start_date_time'].dt.second, unit='s')
4.05 ms ± 130 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

In [29]: %timeit df['start_date_time1'] = df['start_date_time'].values.astype('<M8[m]')
1.73 ms ± 117 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

In [30]: %timeit df['start_date_time'] = df['start_date_time'].dt.floor('T')
1.07 ms ± 116 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

In [31]: %timeit df['start_date_time2'] = df['start_date_time'].apply(lambda t: t.replace(second=0))
183 ms ± 19.7 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

解决方案如果需要字符串输出中日期时间的代表

使用Series.dt.strftime:

print(df['start_date_time'].dt.strftime('%Y-%m-%d %H:%M'))
0    2016-05-19 08:25
1    2016-05-19 16:00
Name: start_date_time, dtype: object

如有必要,将:00 设置为秒:

print(df['start_date_time'].dt.strftime('%Y-%m-%d %H:%M:00'))
0    2016-05-19 08:25:00
1    2016-05-19 16:00:00
Name: start_date_time, dtype: object

【讨论】:

【参考方案2】:

将秒数设置为 0

pd.to_datetime 将返回 datetime 对象,这些对象具有 second 作为属性:您无能为力。您可以将second 设置为0,但该属性仍将保留在此处,并且标准表示仍将包含一个尾随':00'

您需要在df的每个元素上应用replace

import pandas as pd

df = pd.DataFrame('start_date_time': ["2016-05-19 08:25:23","2016-05-19 16:00:45","2016-05-20 07:45:00","2016-05-24 12:50:00","2016-05-25 23:00:00","2016-05-26 19:45:00"])
df['start_date_time'] = pd.to_datetime(df['start_date_time'])
df['start_date_time'] = df['start_date_time'].apply(lambda t: t.replace(second=0))

print(df)
#       start_date_time
# 0 2016-05-19 08:25:00
# 1 2016-05-19 16:00:00
# 2 2016-05-20 07:45:00
# 3 2016-05-24 12:50:00
# 4 2016-05-25 23:00:00
# 5 2016-05-26 19:45:00

:23:45 从第一次开始已被 :00 替换,但它们仍在打印。

从字符串中删除':00'

如果您只想要这些时间的字符串表示,并且只将字符串解析为 datetime 对象以便删除字符串末尾的 ':00',您可以只删除最后 3 个字符:

>>> "2016-05-19 08:25:00"[:-3]
'2016-05-19 08:25'

您可以在初始化 df['start_date_time'] 之前将其应用于列表中的每个元素:

>>> start_date_time = ["2016-05-19 08:25:00","2016-05-19 16:00:00","2016-05-20 07:45:00","2016-05-24 12:50:00","2016-05-25 23:00:00","2016-05-26 19:45:00"]
>>> map(lambda s: s[:-3], start_date_time)
['2016-05-19 08:25', '2016-05-19 16:00', '2016-05-20 07:45', '2016-05-24 12:50', '2016-05-25 23:00', '2016-05-26 19:45']

显示不带秒的日期时间

如果您想使用datetime 对象但不想显示秒数:

print(df['start_date_time'].apply(lambda t: t.strftime('%Y-%m-%d %H:%M')))
# 0    2016-05-19 08:25
# 1    2016-05-19 16:00
# 2    2016-05-20 07:45
# 3    2016-05-24 12:50
# 4    2016-05-25 23:00
# 5    2016-05-26 19:45
# Name: start_date_time, dtype: object

【讨论】:

【参考方案3】:

试一试:

df.index = df.index.map(lambda t: t.strftime('%Y-%m-%d %H:%M'))

正如其中一个 cmets 所写,上述适用于日期不是字符串的情况。但是,如果它们是字符串,您可以简单地从列表中的每个列表中切出最后三个字符:

import pandas as pd

df = pd.DataFrame('date': ["2016-05-19 08:25:00"])

print(df['date'].map(lambda t: t[:-3]))

上面会输出:

0    2016-05-19 08:25
Name: date, dtype: object

【讨论】:

原来的数据是字符串,所以我觉得t.strftime行不通吧? 你是对的!我误读了问题;P 添加了日期为字符串的情况 请注意,您的更新不是写在 cmets 中,而是写在我的回答中。【参考方案4】:

html 代码:

< input type="time" class="form-control" name="meeting_time" required /> 

Python Django 代码:

meeting_time = request.POST['meeting_time'] #Like your_time = "12:35:00"
get_time = meeting_time.strftime("%H:%M")

结果是:

get_time = "12:35"

【讨论】:

【参考方案5】:

您可以使用 timedelta 减去秒数:

import datetime    
d = datetime.datetime.now() #datetime including seconds
without_seconds = d - datetime.timedelta(seconds=d.second)

【讨论】:

【参考方案6】:

先将String转换为datetime对象,然后可以使用replace方法。

from _datetime import *


df = dict()
df['start_date_time'] = ["2016-05-19 08:25:00",
                         "2016-05-19 16:00:00",
                         "2016-05-20 07:45:00",
                         "2016-05-24 12:50:00",
                         "2016-05-25 23:00:00",
                         "2016-05-26 19:45:00"]

for dt in df['start_date_time']:
    cur_dt = datetime.strptime(dt, '%Y-%m-%d %H:%M:%S')
    cur_dt = cur_dt.replace(second=0)
    print(cur_dt)

    cur_dt_without_second = cur_dt.strftime('%Y-%m-%d %H:%M')
    print(cur_dt_without_second)

-------------------
2016-05-19 08:25:00
2016-05-19 08:25
2016-05-19 16:00:00
2016-05-19 16:00
2016-05-20 07:45:00
2016-05-20 07:45
2016-05-24 12:50:00
2016-05-24 12:50
2016-05-25 23:00:00
2016-05-25 23:00
2016-05-26 19:45:00
2016-05-26 19:45

【讨论】:

【参考方案7】:

将字符串转换为日期时间对象,然后对其进行操作

>>> x = ["2016-05-19 08:25:00","2016-05-19 16:00:00","2016-05-20 07:45:00","2016-05-24 12:50:00","2016-05-25 23:00:00","2016-05-26 19:45:00"]
>>> for i in x:
...  y = datetime.datetime.strptime(i, '%Y-%m-%d %H:%M:%S')
...  z = datetime.datetime.strftime(y, '%Y-%m-%d %H:%M')
...  print (y, type(y))
...  print (z, type(z))
... 
(datetime.datetime(2016, 5, 19, 8, 25), <type 'datetime.datetime'>)
('2016-05-19 08:25', <type 'str'>)
(datetime.datetime(2016, 5, 19, 16, 0), <type 'datetime.datetime'>)
('2016-05-19 16:00', <type 'str'>)
(datetime.datetime(2016, 5, 20, 7, 45), <type 'datetime.datetime'>)
('2016-05-20 07:45', <type 'str'>)
(datetime.datetime(2016, 5, 24, 12, 50), <type 'datetime.datetime'>)
('2016-05-24 12:50', <type 'str'>)
(datetime.datetime(2016, 5, 25, 23, 0), <type 'datetime.datetime'>)
('2016-05-25 23:00', <type 'str'>)
(datetime.datetime(2016, 5, 26, 19, 45), <type 'datetime.datetime'>)
('2016-05-26 19:45', <type 'str'>)

【讨论】:

【参考方案8】:

这是从日期时间中删除秒数的一种非常简单的方法:

from datetime import datetime 
print(str(datetime.today())[:16])

输出:

2021-02-14 21:30

它有效地将时间戳转换为文本,只留下前 16 个符号。 只是不要在所有这些括号中迷失自己;)

【讨论】:

【参考方案9】:

这是时间模块而不是日期时间模块,但可能是您正在寻找的...

import time
X = time.strftime("%H:%M")
print(X)

或者你有几秒钟的时间

import time
X = time.strftime("%H:%M:%S")
print(X)

如果你要投反对票,请解释原因

【讨论】:

没有被否决,但是:这是朝着回答问题迈出的一大步,因为如果用户知道他/她在做什么,它将采取最后一步来获得正确答案。但请注意,这不是问题的直接答案,因为您使用的输入数据类型与 OP 所拥有的数据类型之间没有相似之处。【参考方案10】:

正如你提到的那样,我假设你不希望结果中出现秒或微秒。如果是这种情况,那么以下可能会有所帮助:

datetime_variable.strftime("'%Y-%m-%d %H:%M'")

如果字符串中有日期时间,则可以将其转换为日期时间 obj:

from dateutil import parser

datetime_variable = parser.parse(str_datetime_var)

datetime_variable.strftime("'%Y-%m-%d %H:%M'")

【讨论】:

以上是关于如何从日期时间中删除秒?的主要内容,如果未能解决你的问题,请参考以下文章

没有时间的日期不会隐藏秒

如何从日期时间中减去秒并进行比较?

显示日期时间数据库值时删除秒数

如何从日期时间中删除时间

如何在 Python 中更改日期格式? [复制]

如何从busybox中的“日期”获取ISO8601秒格式?