python - 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
任何建议将不胜感激。
解决方案
错误来自您拥有的日期格式。您可能需要将您的月份名称转换为数字,例如 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 的答案,我认为这是正确的方法
推荐阅读
- ios - 如何确定循环内所有异步调用的结束?
- javascript - Session中的PHP/JS信用卡品牌呼应
- c# - 使用单个 Entity Framework Core DbContext 来管理具有同名表的多个数据库模式
- hyperledger-fabric - 超级账本作曲家在交易过程中将参与者添加到参与者数组中
- xcode - Xcodebuild 没有这样的模块
- java - Spring Boot 不为来宾用户调用控制器
- ruby-on-rails - RoR MongoID 查找不起作用?
- node.js - 从 API 创建 Ec2 时扩展根卷
- python - 从 parseAction 返回未更改的标记会生成双重嵌套字典
- python - Numpy ndarray:理解切片对象和“:”