【问题标题】:Convert Pandas Column with hour range 01:00 to 24:00转换小时范围为 01:00 至 24:00 的 Pandas 列
【发布时间】:2020-07-10 09:45:14
【问题描述】:

我有一整年的每小时数据存储在作为对象 dtype 的 Pandas 列中。数据是从具有以下结构的 .CSV 文件导入的:

Date/Time,kWh
 01/01  01:00:00,1.14168620105289
 01/01  02:00:00,0.998495769210657
 01/01  03:00:00,0.949679309420898
 01/01  04:00:00,0.938080118507197
 01/29  20:00:00,1.14161727165962
 01/29  21:00:00,1.01263083086978
 01/29  22:00:00,0.961652730472469
 01/29  23:00:00,0.951211299856564
 01/29  24:00:00,0.949390070561629

因此,日期/时间列包括月、日、小时、分钟和秒。我正在尝试 (1) 将该列转换为 DateTime 并 (2) 将年份设置为 2019。

我在转换时遇到了问题,因为出于某种奇怪的原因,而不是正常的 24 小时范围 00:00 到 23:59,对 .CSV 文件进行编码的组选择了从 01 开始的小时: 00 至 24:00。所以当我运行以下命令时:

cons['Date/Time'] =  pandas.to_datetime(cons['Date/Time'], format=' %m/%d  %H:%M:%S')

我收到以下错误:

ValueError: time data ' 01/01  24:00:00' does not match format ' %m/%d  %H:%M:%S' (match)

我正在寻求帮助将列转换为 DateTime 并将数据的年份设置为 2019。任何帮助将不胜感激。

【问题讨论】:

  • 澄清一下,是24:00 午夜 (00:00) 并且所有其他时间都不正确(如果是,那么它是哪一天的午夜),或者所有时间都偏移了 1(@ 987654327@ 是午夜)?
  • 这个答案解释了如何将24:00 转换为00:00 --> stackoverflow.com/questions/52688645/…
  • 所有小时都偏移 1。年份从 1 月 1 日 1:00 开始,最后一个数据点是 12 月 31 日 24:00。

标签: python pandas datetime


【解决方案1】:

简短回答:我做了一些字符串操作以将所有时间减少一小时

df['temp_col'] = df['Date/Time,kWh'].str.split(':').str[0]
df['temp_col'] = (pd.to_numeric(df['temp_col']) - 1).astype(str)
df['temp_col'] = df['temp_col'].apply(lambda x: f'0{x}' if len(x)==1 else x)
df['temp_col'] = df['temp_col'] + df['Date/Time,kWh'].str[2:]

下面的输出不干净,因为您发布的数据没有用 pd.read_clipboard() 很好地复制,但它应该给你一个想法。

        Date/Time,kWh               temp_col
01/01   01:00:00,1.14168620105289   00:00:00,1.14168620105289
01/01   02:00:00,0.998495769210657  01:00:00,0.998495769210657
01/01   03:00:00,0.949679309420898  02:00:00,0.949679309420898

更多细节:我取出了字符串的第一部分,其中包含小时数,并创建了一个将其转换为整数并减去 1 的列。然后,我将字符串的其余部分添加到其中。根据您的问题,这将是使小时数达到 0-23 而不是 1-24 的一种方法。听起来一切都“比应该晚了一个小时?”。否则,如果您只想制作 24:00 = 00:00(不确定哪种方法适合您的数据)@dzakyputra 评论了一篇文章。你也可以做类似的字符串操作来得到 24:00 到 00:000,所以希望这可以帮助你解决。

如果你想让它成为一个“单行”,你可以,但最好分解成几个步骤。

df['Date/Time,kWh'] = (pd.to_numeric(df['Date/Time,kWh'].str.split(':').str[0])-1).astype(str).apply(lambda x: f'0{x}' if len(x)==1 else x) + df['Date/Time,kWh'].str[2:]

输出:

        Date/Time,kWh
01/01   00:00:00,1.14168620105289
01/01   01:00:00,0.998495769210657
01/01   02:00:00,0.949679309420898

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多