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
开头?