正在将“%d:%H:%M:%S”格式的Pandas系列字符串转换为日期时间格式

ckx4rj1h  于 2023-02-17  发布在  其他
关注(0)|答案(2)|浏览(182)

我有一个Pandas系列,由"169:21:5:24"、"54:9:19:29"等字符串组成,分别代表169天21小时5分24秒和54天9小时19分29秒。
我想把它们转换成datetime对象(更好)或者只是秒的整数。
第一次尝试是

pd.to_datetime(series1, format = '%d:%H:%M:%S')

失败并显示错误消息

time data '169:21:5:24' does not match format '%d:%H:%M:%S' (match)

第二次尝试

pd.to_datetime(series1)

也失败了

expected hh:mm:ss format

第一次尝试似乎工作,如果所有的"天"是少于30或31天,但我的数据包括150天,250天等,并没有月值。
最后,

temp_list1 = [[int(subitem) for subitem in item.split(":")] for item in series1]
temp_list2 = [item[0] * 24 * 3600 + item[1] * 3600 + item[2] * 60 + item[3] for item in temp_list1]

已成功将序列转换为秒列表,但这太长。
我想知道是否有Pandas.Series.dt或datetime方法可以处理此类数据。

omhiaaxx

omhiaaxx1#

我想把它们转换成datetime对象(更好)或者秒的整数
在我看来,你似乎更喜欢寻找一个timedelta,因为不清楚今年应该是什么?
例如,您可以通过(ser您的系列)执行此操作:

ser = pd.Series(["169:21:5:24", "54:9:19:29"])
timedeltas = ser.str.split(":", n=1, expand=True).assign(td=lambda df:
    pd.to_timedelta(df[0].astype("int"), unit="D") + pd.to_timedelta(df[1])
)["td"]
seconds = timedeltas.dt.total_seconds().astype("int")
datetimes = pd.Timestamp("2022") + timedeltas  # year has to be provided

结果:
timedeltas

0   169 days 21:05:24
1    54 days 09:19:29
Name: td, dtype: timedelta64[ns]

seconds

0    14677524
1     4699169
Name: td, dtype: int64

datetimes

0   2022-06-19 21:05:24
1   2022-02-24 09:19:29
Name: td, dtype: datetime64[ns]
qjp7pelc

qjp7pelc2#

【PyData.Pandas】:pandas.to_datetime使用(并指向)[Python.Docs]:datetime - strftime()和strptime()行为声明(强调是我的):

  • %d-月份中的日期作为补零的十进制数。

...

  • %j-一年中的某一天,表示为用零填充的十进制数。

因此,您使用了错误的指令(正确的指令是***%j***):

>>> import pandas as pd
>>>
>>> pd.to_datetime("169:21:5:24", format="%j:%H:%M:%S")
Timestamp('1900-06-18 21:05:24')

如图所示,参考年份为 1900(如第二个 URL 中所指定)。如果要使用当前年份,则需要进行一些额外的处理:

>>> import datetime
>>>
>>> cur_year_str = "{:04d}:".format(datetime.datetime.today().year)
>>> cur_year_str
'2023:'
>>>
>>> pd.to_datetime(cur_year_str + "169:21:5:24", format="%Y:%j:%H:%M:%S")
Timestamp('2023-06-18 21:05:24')
>>>
>>> # Quick leap year test
>>> pd.to_datetime("2020:169:21:5:24", format="%Y:%j:%H:%M:%S")
Timestamp('2020-06-17 21:05:24')

总而言之:

>>> series = pd.Series(("169:21:5:24", "54:9:19:29"))
>>> pd.to_datetime(year_str + series, format="%Y:%j:%H:%M:%S")
0   2023-06-18 21:05:24
1   2023-02-23 09:19:29
dtype: datetime64[ns]

相关问题