如何在python中将不规则的datetime转换为总秒数
我有一列持续时间,但值不同。有些持续时间只是时间格式,有些与日期混合。我想要以总秒为单位的持续时间列。我尝试使用to_datetime和parse_date方法将列转换为,但无法工作。如何在熊猫身上做到这一点?以下是专栏:如何在python中将不规则的datetime转换为总秒数,python,pandas,datetime,dataframe,timedelta,Python,Pandas,Datetime,Dataframe,Timedelta,我有一列持续时间,但值不同。有些持续时间只是时间格式,有些与日期混合。我想要以总秒为单位的持续时间列。我尝试使用to_datetime和parse_date方法将列转换为,但无法工作。如何在熊猫身上做到这一点?以下是专栏: 一种方法是使用pd.Series。使用try/应用,除了子句,该子句按顺序尝试每个方法 此方法的好处是,它将接受timedelta和datetime的各种潜在输入 import pandas as pd, numpy as np df = pd.DataFrame({'M
一种方法是使用
pd.Series。使用try
/应用
,除了
子句,该子句按顺序尝试每个方法
此方法的好处是,它将接受timedelta
和datetime
的各种潜在输入
import pandas as pd, numpy as np
df = pd.DataFrame({'Mixed': ['03:59:49', '1904-01-01 04:06:08']})
def return_seconds(x):
try:
return pd.to_timedelta(x).total_seconds()
except:
try:
dt = pd.to_datetime(x)
return (dt - dt.normalize()).total_seconds()
except:
return np.nan
df['TotalSeconds'] = df['Mixed'].apply(return_seconds).astype(int)
print(df)
# Mixed TotalSeconds
# 0 03:59:49 14389
# 1 1904-01-01 04:06:08 14768
过滤最后8个值,转换后使用: 编辑: 使用正则表达式:
import pandas as pd
df = pd.DataFrame({"a": ["03:59:49", "04:59:49", "1904-01-01 05:59:49", "1904-01-01 06:59:49"]})
df["TotalSeconds"] = pd.to_timedelta(df["a"].str.extract('(\d{2}:\d{2}:\d{2})')).dt.total_seconds()
print(df)
输出:
a TotalSeconds
0 03:59:49 14389.0
1 04:59:49 17989.0
2 1904-01-01 05:59:49 21589.0
3 1904-01-01 06:59:49 25189.0
“但它不能工作……”。显示不起作用的代码。欢迎使用StackOverflow。请花点时间阅读这篇文章,以及如何提供答案,并相应地修改你的问题。这些提示可能也很有用。谢谢Rakesh,它很有效。但是有一些NaN值,如何删除或将其转换为0。您可以使用
df.fillna(0)
Ex:pd.to_timedelta(df[“a”].str.extract('(\d{2}:\d{2}:\d{2}:\d{2})).dt total_seconds().fillna(0)
当我将原始熊猫系列作为数据帧'data['duration duration pd'=pd.to_timedelta(data['Finish u Netto'.]str 8).dt.total_seconds().astype(int)然后将错误显示为“ValueError:expected hh:mm:ss format”@MAK-似乎存在其他格式的数据,因此请检查编辑的答案。数据是数据帧,列类型是object。现在它给出了另一个错误:“TypeError:不能转换为datetime”
import pandas as pd
df = pd.DataFrame({"a": ["03:59:49", "04:59:49", "1904-01-01 05:59:49", "1904-01-01 06:59:49"]})
df["TotalSeconds"] = pd.to_timedelta(df["a"].str.extract('(\d{2}:\d{2}:\d{2})')).dt.total_seconds()
print(df)
a TotalSeconds
0 03:59:49 14389.0
1 04:59:49 17989.0
2 1904-01-01 05:59:49 21589.0
3 1904-01-01 06:59:49 25189.0