首页 > 解决方案 > Pandas:将日期转换为可用格式和计算周期

问题描述

我有一个这样的数据框:

           timestamp                   
0          09/May/2016:10:53:30  
1          09/May/2016:10:54:30  
2          09/May/2016:10:55:30             
3          09/May/2016:10:56:30
4          09/May/2016:10:57:30
5          09/May/2016:10:58:30
6          09/May/2016:10:59:30  

格式为day/month/year:hours:minutes:seconds

我需要为每个时间戳计算两分钟的时间。但这里的问题是日期格式错误,无法与 pandasto_period函数一起使用。我努力了:

df['Period'] = pd.to_datetime(df['timestamp']).dt.to_period(minute=2, errors='coerce')

但这会引发异常:

Unknown string format

预期输出如下:

           timestamp                         Period
0          09/May/2016:10:53:30                 1
1          09/May/2016:10:54:30                 1
2          09/May/2016:10:55:30                 1                 
3          09/May/2016:10:56:30                 2
4          09/May/2016:10:57:30                 2
5          09/May/2016:10:58:30                 2
6          09/May/2016:10:59:30                 3

任何建议将不胜感激。

标签: pythonpandas

解决方案


错误来自您拥有的日期格式。您可能需要将您的月份名称转换为数字,例如 May --> "05" 并指定格式:

date_format = "%d/%m/%Y:%H:%M:%S"
dict_months = {
    "January": "01",
    "February": "02",
    "March": "03",
    "April": "04",
    "May": "05",
    "June": "06",
    "July": "07",
    "August": "08",
    "September": "09",
    "October": "10",
    "November": "11",
    "December": "12"
}

这将使错误消失...

它有点脏,(可能存在本地 pandas 函数来做到这一点,¯_(ツ)_/¯),但这里有一个解决方案:


# define your start date and a period, and then after every period minutes increment the value of period like this
start_date = pd.to_datetime("09/05/2016:10:53:30", format=date_format)
period = 2
time_period_func = lambda x: int(1 + ((x - start_date).total_seconds()//60 ) // (period+1))

df["period"] = pd.to_datetime(df["timestamp"].replace(dict_months, regex=True), format=date_format).apply(time_period_func)

基本上你会得到当前日期和开始之间的时间增量(以分钟为单位)。然后,您应用一个简单的公式通过除以 timedelta bu 周期来获得周期。

编辑1:我的回答没有考虑秒数,只考虑了时间戳的分钟部分!如果您也想考虑秒数,请查看@ThePyGuy 的答案,我认为这是正确的方法


推荐阅读