web-dev-qa-db-ja.com

日時から秒を削除する方法は?

私は次の日付を持っていて、次のコードを試しました、

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'
6
user7779326

出力に必要な場合の解決策datetimes

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 分単位で使用TまたはMin

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

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

最初にnumpy valuesに変換し、次にseconds<M8[m]にキャストすることで切り捨てることができますが、この解決策は可能なタイムゾーンを削除します。

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

別の解決策は、_ timedelta からsecondシリーズを作成し、減算することです。

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)

必要な場合のソリューションstrings出力の日時の表現

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
4
jezrael

秒を0に設定します

pd.to_datetimeは、属性としてdatetimeを持つsecondオブジェクトを返します。これについてできることはあまりありません。 second0に設定できますが、属性はここにあり、標準表現には末尾に':00'が含まれます。

replaceの各要素にdfを適用する必要があります:

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'を削除します

それらの時間の文字列表現だけが必要で、文字列の最後の':00'を削除するためにdatetimeオブジェクトへの文字列のみを解析する場合は、最後の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
5
Eric Duminil

HTMLコード:

<input type = "time" class = "form-control" value = "" name = "meeting_time"が必要/>

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"

3
jahurul25

これを試してみてください:

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

コメントの1つに書かれているように、上記は日付が文字列でない場合に適用されます。ただし、文字列の場合は、リストの各リストの最後の3文字を単純にスライスできます。

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
2
user6165050

最初に文字列を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
1
M. Leung

Timedeltaを使用して秒を減算できます。

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

文字列をdatetimeオブジェクトに変換してから操作する

>>> 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'>)
0
Rolf of Saxony

あなたが削除したと述べたので、私はあなたが結果に秒またはマイクロ秒を望まないことを仮定しました。これが事実である場合、次のことが役立つかもしれません:

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'")

0
Lyncean Patel