Как добавить timedelta в datetime, когда время в «00:00:00» с использованием Python - PullRequest
0 голосов
/ 20 сентября 2019

Здесь у меня есть набор данных с датой, временем и одним входным столбцом.Здесь я хочу выбрать время для конкретного значения в столбце ввода.Затем я конвертирую это время в "00: 00: 00 '

. Затем я хочу добавить для этого времени дельту времени (часы = 5).

Я попробовал код, но онпросто покажи мне только время. дата отсутствует.

Мой код:

data['date']= pd.to_datetime(data['date'] + " " + data['time'],
                    format='%d/%m/%Y %H:%M:%S', dayfirst=True)
mask = data['X3'].eq(7)
data['t1'] = data['date'].mask(mask, data['date'].dt.floor('d'))
print (data['t1'].dtype)
def f(x):
ts = x.total_seconds()
hours, remainder = divmod(ts, 3600)
minutes, seconds = divmod(remainder, 60)
return ('{:02d}:{:02d}:{:02d}').format(int(hours), int(minutes), int(seconds)) 

data['t1'] = data['t1'].apply(f)


match_time="00:00:00"
T = data.loc[data['t1'] == match_time, 't1']

вывод:

00:00:00
00:00:00
00:00:00
00:00:00

Но я ожидал, что результат будет:

         datetime                     expected output
10/3/2018	6:15:00         10/3/2018 00:00:00
10/3/2018	7:45:00         10/3/2018 00:00:00
10/3/2018	9:00:00         10/3/2018 00:00:00
10/3/2018	9:25:00         10/3/2018 00:00:00

Подмножество моего CSV-файла:

date	time	X3
10/3/2018	6:15:00 	7
10/3/2018	6:45:00 	5
10/3/2018	7:45:00 	7
10/3/2018	9:00:00 	7
10/3/2018	9:25:00 	7
10/3/2018	9:30:00 	5
10/3/2018	11:00:00	7
10/3/2018	11:30:00	7
10/3/2018	13:30:00	7
10/3/2018	13:50:00	5
10/3/2018	15:00:00	7
10/3/2018	15:25:00	7
10/3/2018	16:25:00	7
10/3/2018	18:00:00	7
10/3/2018	19:00:00	5
10/3/2018	19:30:00	7
10/3/2018	20:00:00	7
10/3/2018	22:05:00	7
10/3/2018	22:15:00	5
10/3/2018	23:40:00	7
10/4/2018	6:58:00 	7
10/4/2018	13:00:00	7

Может кто-нибудь помочь мне решить эту ошибку?

Ошибка:

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-49-dec077bca7c3> in <module>()
     16     return ('{:02d}:{:02d}:{:02d}').format(int(hours), int(minutes), int(seconds))
     17 
---> 18 data['t1'] = data['t1'].apply(f)
     19 
     20 

~\Anaconda3\lib\site-packages\pandas\core\series.py in apply(self, func, convert_dtype, args, **kwds)
   3190             else:
   3191                 values = self.astype(object).values
-> 3192                 mapped = lib.map_infer(values, f, convert=convert_dtype)
   3193 
   3194         if len(mapped) and isinstance(mapped[0], Series):

pandas/_libs/src\inference.pyx in pandas._libs.lib.map_infer()

<ipython-input-49-dec077bca7c3> in f(x)
     11 
     12 def f(x):
---> 13     ts = x.total_seconds()
     14     hours, remainder = divmod(ts, 3600)
     15     minutes, seconds = divmod(remainder, 60)

AttributeError: 'Timestamp' object has no attribute 'total_seconds'

1 Ответ

1 голос
/ 21 сентября 2019

Я действительно не уверен, какую проблему вы хотите решить или какова ваша цель, но то, что вы говорите, вы хотите сделать, может быть сделано.Но вам уже дан ответ на вопрос, поэтому я не уверен, где вы застряли.

Давайте возьмем ваше первое утверждение:

Здесь у меня естьнабор данных с датой, временем и одним входным столбцом.Здесь я хочу выбрать время для конкретного значения в столбце ввода.Затем я конвертирую это время в "00: 00: 00 '

. Вот что ваш код уже делает. Я убрал его здесь и сделал его исполняемым:

# Here I've added the preliminary bits so it's executable.
import pandas as pd
data = pd.read_csv("data.csv", delimiter='\t')
# Here I've fixed the line wrapping, added .str.strip() because your data has trailing
# spaces, and removed dayfirst because it doesn't make sense if you're specifying format
data['date']= pd.to_datetime(data['date'] + " " + data['time'].str.strip(), format='%d/%m/%Y %H:%M:%S')
mask = data['X3'].eq(7)
data['t1'] = data['date'].mask(mask, data['date'].dt.floor('d'))
# And you're done. You can print the results, for example:
data[data['X3'] == 7]['t1']

Это дает

0    2018-03-10
2    2018-03-10
3    2018-03-10
4    2018-03-10
6    2018-03-10
7    2018-03-10
8    2018-03-10
10   2018-03-10
11   2018-03-10
12   2018-03-10
13   2018-03-10
15   2018-03-10
16   2018-03-10
17   2018-03-10
19   2018-03-10
20   2018-04-10
21   2018-04-10
Name: t1, dtype: datetime64[ns]

, который показывает, что все строки, которые соответствуют вашему условию, теперь изменили свое время на 00:00:00. Обратите внимание, что pandas решает подавить показ времени, когда они все одинаковые. Вы можетенапечатайте все данные с помощью data, чтобы заставить печатать время.

Затем вы говорите, что хотите

, для этого времени добавьте дельту времени (часы = 5).

Это неоднозначно, и, поскольку вы не показываете никаких попыток или не включаете его в ожидаемый результат, я не могу быть уверен. Но если предположить, что вы просто хотите 5 часов до вашего столбца datetime,это будет делать:

data['t1'] = data['t1'] + pd.DateOffset(hours=5)

Или, если вы хотите сделать это только для выбранных вами строк:

data.loc[data['X3'] == 7, 't1'] = data['t1'] + pd.DateOffset(hours=5)

И тогда вы скажете

Я пыталсякод, но он просто показывает мне только время. дата отсутствует.

Это то, что ваш код (в частности, f(x)) делает.Поэтому, если вы не хотите, чтобы это делалось, не используйте этот код.

Надеюсь, это поможет.Что может помочь в будущем, так это начать с минимального воспроизводимого примера (MRE) .В вашем вопросе было много вещей, которые не помогли, и, вероятно, когда вы начнете сокращать MRE, вы все равно найдете то, что хотели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...