【问题标题】:Concatenating many time and date columns连接多个时间和日期列
【发布时间】:2021-12-25 09:33:25
【问题描述】:

我有许多日期和时间列对(每个大约 15 个)共享相同的前缀,即。 SH 或 DEL。这些列都是 dtype 对象,即。细绳。所有列都属于同一个Dataframe。这是两个这样的对的示例:

  SH_DATE         DEL_DATE          SH_TIME      DEL_TIME                

 2020-04-22      2020-04-27         19:42:00     19:11:00           
 2020-04-22      2020-04-25         19:42:00     19:26:00           
 2020-04-24      2020-04-24         09:55:00     09:55:00           
 2020-04-24      2020-04-26         14:27:00     14:27:00           

我想将每个日期/时间列对组合成一个列。我的第一个倾向是在dataframe 中将LIKE 语句用于时间和日期列,方法是在它们自己的不同列表中提取日期/时间,然后循环它们以获取pd.concat 函数,但还没有找到还没有解决办法。

所需输出示例:

     SH_DATETIME            DEL_DATETIME                        

 2020-04-22 19:42:00     2020-04-27 19:11:00                
 2020-04-22 19:42:00     2020-04-25 19:26:00                    
 2020-04-24 09:55:00     2020-04-24 09:55:00                    
 2020-04-24 14:27:00     2020-04-26 14:27:00          

【问题讨论】:

  • 你的问题不是很清楚。你能提供一个预期输出的例子吗?
  • 您的日期和时间列在同一个表中吗?我不知道为什么LIKE 是思考的一部分
  • 这些列是否包含字符串?
  • 我已经编辑了这个问题,希望它更准确。早点我试着让它简短​​而甜蜜。
  • 我的错误。其中之一应该是 DEL_TIME。

标签: python pandas dataframe datetime concatenation


【解决方案1】:

确定唯一的列名前缀(例如“SH”或“DEL”),并将相应的日期/时间列与空格作为分隔符。解析组合的to datetime

pfxs = df.columns.to_series().str.replace('_TIME', '').str.replace('_DATE', '').unique()

for p in pfxs:
    if f'{p}_DATE' in df.columns and f'{p}_TIME' in df.columns:
        df[f'{p}_DATETIME'] = pd.to_datetime(df[f'{p}_DATE']+' '+df[f'{p}_TIME'])
df
      SH_DATE    DEL_DATE  ...         SH_DATETIME        DEL_DATETIME
0  2020-04-22  2020-04-27  ... 2020-04-22 19:42:00 2020-04-27 19:11:00
1  2020-04-22  2020-04-25  ... 2020-04-22 19:42:00 2020-04-25 19:26:00
2  2020-04-24  2020-04-24  ... 2020-04-24 09:55:00 2020-04-24 09:55:00
3  2020-04-24  2020-04-26  ... 2020-04-24 14:27:00 2020-04-26 14:27:00

为了使这在一定程度上具有故障安全性,您可以添加检查以确保在尝试合并之前,给定前缀存在日期时间列。

如果您的日期和时间列中的某些元素无法解析为日期时间,则可以选择设置 errors='coerce',而对于无法解析的元素,您可以使用 NaT,例如

pd.to_datetime(df[f'{p}_DATE']+' '+df[f'{p}_TIME'], errors='coerce')

在上面的代码中。

【讨论】:

  • unsupported operand type(s) for +: 'int' and 'str' 我认为我应该在运行您的建议之前将所有列转换为字符串?
  • @Saurus hm 从您的示例中,我假设日期/时间列已经是字符串。哪一行准确地引发了错误(您可以将回溯添加到问题中)吗?
  • 将它们全部转换为字符串后,在 concat 之前,我收到错误:ParserError: month must be in 1..12: 0 0
  • @Saurus 是的,似乎并非所有 _DATE 和 _TIME 列都包含格式如下的元素,例如2020-04-2719:42:00 分别。您需要先清理,但在不知道确切内容的情况下很难说如何
  • @Saurus 您可以添加isinstance 检查,但我怀疑这会产生令人满意的结果。 Python 没有严格类型化,大多数对象都可以转换为字符串,但并非所有字符串都可以转换为日期时间。另一个选项可能是try/except 来捕获解析器错误。但这只是猜测,不知道您必须处理的实际内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-13
  • 1970-01-01
  • 1970-01-01
  • 2013-07-17
  • 1970-01-01
  • 2019-11-12
  • 1970-01-01
相关资源
最近更新 更多