pandas 根据条件转换为日期时间

ix0qys7i  于 2022-12-02  发布在  其他
关注(0)|答案(2)|浏览(146)

我想将datetime对象转换为秒

0       49:36.5
1       50:13.7
2       50:35.8
3       50:37.4
4       50:39.3
        ...    
92    1:00:47.8
93    1:01:07.7
94    1:02:15.3
95    1:05:03.0
96    1:05:29.6
Name: Finish, Length: 97, dtype: object

问题是格式在索引92处改变,这导致错误:值错误:之前应为hh:mm:ss格式。
此错误是在尝试将列转换为秒时导致的

filt_data["F"] = pd.to_timedelta('00:'+filt_data["Finish"]).dt.total_seconds()

当我在两个步骤中进行转换时,它可以工作,但会产生两个不同的列,我不知道如何合并,也不知道它看起来是否真的有效:

filt_data["F1"] = pd.to_timedelta('00:'+filt_data["Finish"].loc[0:89]).dt.total_seconds()
filt_data["F2"] = pd.to_timedelta('0'+filt_data["Finish"].loc[90:97]).dt.total_seconds()

上面的代码没有引起任何错误,并且完成了任务,但是产生了两个不同的列。2你知道怎么做吗?
理想情况下,我希望遍历列,并根据格式(即“50:39.3”或“1:00:47.8”)将“00:“或“0”添加到对象中。

idfiyjo8

idfiyjo81#

我会使用str.replace

pd.to_timedelta(df['Finish'].str.replace('^(\d+:\d+\.\d+)', r'0:\1', regex=True))

或者str.countmap

pd.to_timedelta(df['Finish'].str.count(':').map({1: '0:', 2: ''}).add(df['Finish']))

输出量:

0    0 days 00:49:36.500000
1    0 days 00:50:13.700000
2    0 days 00:50:35.800000
3    0 days 00:50:37.400000
4    0 days 00:50:39.300000
92   0 days 01:00:47.800000
93   0 days 01:01:07.700000
94   0 days 01:02:15.300000
95          0 days 01:05:03
96   0 days 01:05:29.600000
Name: Finish, dtype: timedelta64[ns]
aemubtdh

aemubtdh2#

根据您的数据:

import pandas as pd

times = [
    "49:36.5",
    "50:13.7",
    "50:35.8",
    "50:37.4",
    "50:39.3",
    "1:00:47.8",
    "1:01:07.7",
    "1:02:15.3",
    "1:05:03.0",
    "1:05:29.6",
]

df = pd.DataFrame({'time': times})
df

您可以编写一个函数,应用于时间列中的每个单独条目:

def format_time(time):
    time = time.split('.')[0]
    time = time.split(':')
    if(len(time) < 3):
        time.insert(0, "0")
    return ":".join(time)

df["formatted_time"] = df.time.apply(format_time)    
df

然后,您可以执行两个步骤:
1.将列转换为日期时间
1.将列转换为UNIX时间戳(自1970-01-01以来的秒数)

df["time_datetime"] = pd.to_datetime(df.formatted_time, infer_datetime_format=True)
df["time_seconds"] = (df.time_datetime - pd.Timestamp("1970-01-01")) // pd.Timedelta('1s')
df

相关问题