在这里,我有一个包含日期,时间和一个输入列的数据集。在这里,我想在输入栏中选择特定值的时间。然后,我将该时间转换为“ 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'
答案 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时,您仍然会找到想要的东西。