Python 如何更改数据库中特定行上的时间戳
我有一个Python 如何更改数据库中特定行上的时间戳,python,pandas,indexing,Python,Pandas,Indexing,我有一个pandasdf,它在同一列中包含不同的时间戳和字符串。下面显示了一个示例: 一旦时间过了午夜,数据就会吐出这个奇怪的351代码,然后返回到12小时的时间。因此第5行的时间实际上是12:01:42,第8行的时间是13:00:00 我可以在这些时间戳上加上12个小时,但我需要去掉前3个值 我试图通过索引适当的时间(午夜后)并在df中为x应用[x[3:]来做到这一点。但这会删除此列中的字符串。因此,AA和BB也被删除 我有点纠结于如何在不删除未指定值的情况下实现这一点。是否可以在午夜后选择适
pandas
df
,它在同一列中包含不同的时间戳和字符串。下面显示了一个示例:
一旦时间过了午夜,数据就会吐出这个奇怪的351代码,然后返回到12小时的时间。因此第5行的时间实际上是12:01:42,第8行的时间是13:00:00
我可以在这些时间戳上加上12个小时,但我需要去掉前3个值
我试图通过索引适当的时间(午夜后)并在df中为x应用[x[3:]
来做到这一点。但这会删除此列中的字符串。因此,AA
和BB
也被删除
我有点纠结于如何在不删除未指定值的情况下实现这一点。是否可以在午夜后选择适当的时间(仅时间戳),删除351并添加12小时而不丢失任何数据
import pandas as pd
k = 5
N = 10
d = ({'Time' : ['18:00:00','AA','BB', '23:00:00','AA','35112:01:42','AA','AA','35113:00:00','AA'],
'Events' : ['ABC','DEF','GHI','JKL','ABC','DEF','GHI','JKL','DEF','JKL'],
'Number1' : ['xx','xx',1,'xx','xx','xx',2,'xx', 'xx', 1]})
df = pd.DataFrame(data=d)
输出:
Events Number1 Time
0 ABC xx 18:00:00
1 DEF xx AA
2 GHI 1 BB
3 JKL xx 23:00:00
4 ABC xx AA
5 DEF xx 35112:01:42
6 GHI 2 AA
7 JKL xx AA
8 DEF xx 35113:00:00
9 JKL 1 AA
Events Number1 Time
0 ABC xx 18:00:00
1 DEF xx AA
2 GHI 1 BB
3 JKL xx 23:00:00
4 ABC xx AA
5 DEF xx 24:01:42
6 GHI 2 AA
7 JKL xx AA
8 DEF xx 25:00:00
9 JKL 1 AA
预期产出:
输出:
Events Number1 Time
0 ABC xx 18:00:00
1 DEF xx AA
2 GHI 1 BB
3 JKL xx 23:00:00
4 ABC xx AA
5 DEF xx 35112:01:42
6 GHI 2 AA
7 JKL xx AA
8 DEF xx 35113:00:00
9 JKL 1 AA
Events Number1 Time
0 ABC xx 18:00:00
1 DEF xx AA
2 GHI 1 BB
3 JKL xx 23:00:00
4 ABC xx AA
5 DEF xx 24:01:42
6 GHI 2 AA
7 JKL xx AA
8 DEF xx 25:00:00
9 JKL 1 AA
str.用lambda
和组替换
以添加12个
def add_twelve(t):
return str(int(t[:2]) + 12) + t[2:]
df.Time.str.replace(r'\d{3}(\d{2}:\d{2}:\d{2})', lambda x: add_twelve(x.group(1)))
0 18:00:00
1 AA
2 BB
3 23:00:00
4 AA
5 24:01:42
6 AA
7 AA
8 25:00:00
9 AA
Name: Time, dtype: object
str.用lambda
和组替换
以添加12个
def add_twelve(t):
return str(int(t[:2]) + 12) + t[2:]
df.Time.str.replace(r'\d{3}(\d{2}:\d{2}:\d{2})', lambda x: add_twelve(x.group(1)))
0 18:00:00
1 AA
2 BB
3 23:00:00
4 AA
5 24:01:42
6 AA
7 AA
8 25:00:00
9 AA
Name: Time, dtype: object
您可以使用掩码,然后应用一些字符串操作,例如
mask = df['Time'].str.startswith('351')
df.loc[mask,'Time'] = (df[mask]['Time'].str[3:].str[:2].astype(int)+12).astype(str) + df[mask]['Time'].str[3:].str[2:]
Events Number1 Time
0 ABC xx 18:00:00
1 DEF xx AA
2 GHI 1 BB
3 JKL xx 23:00:00
4 ABC xx AA
5 DEF xx 24:01:42
6 GHI 2 AA
7 JKL xx AA
8 DEF xx 25:00:00
9 JKL 1 AA
由于它的351需要被删除切片它是选择的方式,即
df[mask]['Time'].str[3:]
5 12:01:42
8 13:00:00
Name: Time, dtype: object
(df[mask]['Time'].str[3:].str[:2])
5 12
8 13
Name: Time, dtype: object
您可以使用掩码,然后应用一些字符串操作,例如
mask = df['Time'].str.startswith('351')
df.loc[mask,'Time'] = (df[mask]['Time'].str[3:].str[:2].astype(int)+12).astype(str) + df[mask]['Time'].str[3:].str[2:]
Events Number1 Time
0 ABC xx 18:00:00
1 DEF xx AA
2 GHI 1 BB
3 JKL xx 23:00:00
4 ABC xx AA
5 DEF xx 24:01:42
6 GHI 2 AA
7 JKL xx AA
8 DEF xx 25:00:00
9 JKL 1 AA
由于它的351需要被删除切片它是选择的方式,即
df[mask]['Time'].str[3:]
5 12:01:42
8 13:00:00
Name: Time, dtype: object
(df[mask]['Time'].str[3:].str[:2])
5 12
8 13
Name: Time, dtype: object
让我们尝试str.replace
为可调用的:
df['Time'] = df.Time.str.replace(r'351(\d{2})', lambda x: str(12 + int(x.group(1))))
或者,您可以使用re.compile
和列表理解来挤出更多的性能:
import re
p = re.compile(r'351(\d{2})')
df['Time'] = [
p.sub(lambda x: str(12 + int(x.group(1))), y) for y in df['Time'].tolist()
]
让我们尝试str.replace
为可调用的:
df['Time'] = df.Time.str.replace(r'351(\d{2})', lambda x: str(12 + int(x.group(1))))
或者,您可以使用re.compile
和列表理解来挤出更多的性能:
import re
p = re.compile(r'351(\d{2})')
df['Time'] = [
p.sub(lambda x: str(12 + int(x.group(1))), y) for y in df['Time'].tolist()
]
我的尝试是:
创建列以索引损坏的数据:
df['corruptedTime'] = df.Time.str.startswith('351')
删除“怪异351”:
df.loc[df.corruptedTime, 'Time'] = df.Time[df.corruptedTime].str.slice(3)
将12添加到小时和计算模数24:
df.loc[df.corruptedTime, 'Time'] = df.Time[df.corruptedTime].apply(lambda s: str((int(s[:2]) + 12) % 24).zfill(2) + s[2:])
如果不再需要,请删除索引器:
df = df.drop(columns=['corruptedTime'])
Events Number1 Time
0 ABC xx 18:00:00
1 DEF xx AA
2 GHI 1 BB
3 JKL xx 23:00:00
4 ABC xx AA
5 DEF xx 00:01:42
6 GHI 2 AA
7 JKL xx AA
8 DEF xx 01:00:00
9 JKL 1 AA
我的尝试是:
创建列以索引损坏的数据:
df['corruptedTime'] = df.Time.str.startswith('351')
删除“怪异351”:
df.loc[df.corruptedTime, 'Time'] = df.Time[df.corruptedTime].str.slice(3)
将12添加到小时和计算模数24:
df.loc[df.corruptedTime, 'Time'] = df.Time[df.corruptedTime].apply(lambda s: str((int(s[:2]) + 12) % 24).zfill(2) + s[2:])
如果不再需要,请删除索引器:
df = df.drop(columns=['corruptedTime'])
Events Number1 Time
0 ABC xx 18:00:00
1 DEF xx AA
2 GHI 1 BB
3 JKL xx 23:00:00
4 ABC xx AA
5 DEF xx 00:01:42
6 GHI 2 AA
7 JKL xx AA
8 DEF xx 01:00:00
9 JKL 1 AA
我在想模式。@wwii我假设'^351'
等只是伪字符串,所以尽可能具体。使模式明确/具体肯定有好处。我确实看到了一些其他帖子,但是@coldspeed提到我的特定df有一些特殊的细微差别。我在想“^351”
用于模式。@二战期间我假设AA
等只是伪字符串,因此尽可能使其具体化。使模式明确化/具体化肯定有好处。我确实看到了一些其他帖子,但正如@coldspeed提到的,我的具体df有一些特殊的细微差别。你可以选择小组的方式??我是第一次看到它。好one@Dark是的,您可以在callable中引用捕获组,就像re.sub
一样。您可以选择way组??我是第一次看到它。好one@Dark是的,您可以在callable中引用捕获组,就像re.sub
@wwii I dunno一样,这看起来比您建议的链接要复杂一些。。。我不会对此感到满意。351
代码很奇怪。我想知道这是什么意思…@coldspeed-操作说明我可以在这些时间戳上加上12个小时
,所以我认为问题在于删除不需要的文本。@wwii这是真的。与另一个问题相比,主要区别在于列中的附加字符串。正如问题中提到的,当我更改列中的时间戳时,它也会删除其他值。另一个问题在列中只包含时间戳。其他字符串,AA,BB
,能否以351
开头?@wwii I dunno,这看起来比您建议的链接要复杂一些。。。我不会对此感到满意。351
代码很奇怪。我想知道这是什么意思…@coldspeed-操作说明我可以在这些时间戳上加上12个小时
,所以我认为问题在于删除不需要的文本。@wwii这是真的。与另一个问题相比,主要区别在于列中的附加字符串。正如问题中提到的,当我更改列中的时间戳时,它也会删除其他值。另一个问题在列中只包含时间戳。其他字符串,AA,BB
能否以351
开头?