pandas 使用条件向datetime添加一秒

qmb5sa22  于 2023-03-06  发布在  其他
关注(0)|答案(4)|浏览(232)

请看下面的Pandas数据样本。

ID  DT                  InOut
120 2022-12-22-02:12:123    IN
120 2022-12-23-04:12:456    OUT
120 2022-12-26-08:11:125    IN
120 2022-12-30-02:12:126    OUT

首先,我需要将datetime变量的第二部分更改为2位数(例如:2023 - 03 - 03 14:11:43).然后我只需要为InOut = OUT向我的datetime变量添加一秒。
我的dt变量是datetime64 [ns]格式的,我无法为datetime变量创建虚拟数据。
谢谢你的帮助!

import pandas as pd
df = pd.DataFrame({'ID': [120, 120, 120, 120], 
                   'InOut': ['IN', 'OUT', 'IN', 'OUT']})
kpbwa7wx

kpbwa7wx1#

您可以使用strftime()将datetime变量转换为所需的格式。要将datetime变量转换为所需的格式,您可以执行以下操作:

df['DT'] = df['DT'].apply(lambda x: datetime.strftime(x, '%Y-%m-%d %H:%M:%S'))

如果你想用InOut=Out给datetime增加一秒:

df.loc[df['InOut'] == 'OUT', 'DT'] = df.loc[df['InOut'] == 'OUT', 'DT'].apply(lambda x: datetime.strptime(x, '%Y-%m-%d %H:%M:%S') + timedelta(seconds=1))
knpiaxh1

knpiaxh12#

将DT列转换为日期时间格式,并将秒截断为两(2)位数,然后在满足条件时使用.loc添加一个秒

df['DT'] = (pd.to_datetime(df['DT'], format='%Y-%m-%d-%H:%M:%S%f').dt.floor('s')
              .apply(lambda x: x.replace(microsecond=(x.microsecond // 1000) * 1000)))
df.loc[df['InOut'] == 'OUT', 'DT'] += pd.Timedelta(seconds=1)
ID                  DT InOut
0  120 2022-12-22 02:12:12    IN
1  120 2022-12-23 04:12:46   OUT
2  120 2022-12-26 08:11:12    IN
3  120 2022-12-30 02:12:13   OUT
os8fio9y

os8fio9y3#

使用pd.to_datetimeDT列调整为有效的日期时间格式,然后-使用pd.Timedelta(seconds=1)添加1秒:

df['DT'] = pd.to_datetime(df['DT'], format = '%Y-%m-%d-%H:%M:%S', exact=False)
df.loc[df['InOut'].eq('OUT'), 'DT'] += pd.Timedelta(seconds=1)
ID                  DT InOut
0  120 2022-12-22 02:12:12    IN
1  120 2022-12-23 04:12:46   OUT
2  120 2022-12-26 08:11:12    IN
3  120 2022-12-30 02:12:13   OUT
bqf10yzr

bqf10yzr4#

import pandas as pd
import datetime
import numpy as np

df = pd.DataFrame({'ID':[120, 120, 120, 120],
                   'DT':['2022-12-22-02:12:123', 
                         '2022-12-23-04:12:456', 
                         '2022-12-26-08:11:125', 
                         '2022-12-30-02:12:126'],
                   'InOut':['IN', 'OUT', 'IN', 'OUT']
                   })

df.loc[:, ('DT')] = pd.to_datetime(df['DT'].add('0'*5), 
                                   format='%Y-%m-%d-%H:%M:%S%f') # (1)

r = df[df['InOut'].eq('OUT')].copy()
r['DT'] = r['DT'].add(datetime.timedelta(seconds=1))

df.loc[:, ('DT')] = df['DT'].mask(df['InOut'].eq('OUT'), r['DT'])

print(df)
ID                      DT InOut
0  120 2022-12-22 02:12:12.300    IN
1  120 2022-12-23 04:12:46.600   OUT
2  120 2022-12-26 08:11:12.500    IN
3  120 2022-12-30 02:12:13.600   OUT

(1)注我将原始的df转换为更传统的日期时间表示

相关问题