如何使用python在时间为“ 00:00:00”时将timedelta添加到日期时间

时间:2019-09-20 07:26:12

标签: python-3.x pandas datetime

在这里,我有一个包含日期,时间和一个输入列的数据集。在这里,我想在输入栏中选择特定值的时间。然后,我将该时间转换为“ 00:00:00”

然后我要在那段时间内添加时间增量(hours = 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 个答案:

答案 0 :(得分:1)

我真的不确定您要解决的问题或目标是什么,但是您要说的是可以完成的。但是您已经得到了问题的答案,所以我不确定您会陷入哪里。

让我们发表您的第一句话:

  

在这里,我有一个包含日期,时间和一个输入列的数据集。在这里,我想在输入栏中选择特定值的时间。然后,我将该时间转换为“ 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。请注意,大熊猫决定不显示相同的时间。您可以使用data打印所有数据,以强制打印时间。

然后您说要

  

在那段时间内加上时间增量(小时= 5)。

这是模棱两可的,并且由于您没有表现出任何尝试或将其包括在预期的输出中,所以我不确定。但是,假设您只想在datetime栏上输入5个小时,就会这样做:

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

或者如果您只想对选定的行进行操作:

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

然后你说

  

我尝试了一个代码,但只显示了时间。日期丢失。

您的代码(特别是f(x))的作用是什么。因此,如果您不希望它那样做,请不要使用该代码。

希望有帮助。将来可能更有用的是从minimum, reproducible example (MRE)开始。您的问题中有很多东西无济于事,很可能当您开始将其剥离MRE时,您仍然会找到想要的东西。