【问题标题】:Pandas - convert float to proper datetime or time objectPandas - 将浮点数转换为正确的日期时间或时间对象
【发布时间】:2019-06-16 05:30:59
【问题描述】:

我有一个包含天气信息的观测数据集。每列包含特定字段,其中日期和时间位于两个单独的列中。时间列包含每小时时间,如 0000、0600 .. 直到 2300。我要做的是根据特定时间范围过滤数据集,例如在 0000 UTC 到 0600 UTC 之间。当我尝试读取 pandas 数据框中的数据文件时,默认情况下,时间列以浮点数读取。当我尝试将其转换为数据时间对象时,它会产生一种我无法转换的格式。代码示例如下:

import pandas as pd
import datetime as dt 
df = pd.read_excel("test.xlsx") 
df.head()

产生以下结果:

       tdate   itime moonph  speed   ...          qnh  windir maxtemp mintemp
0  01-Jan-17  1000.0    NM7      5   ...    $1,011.60    60.0  $32.60  $22.80
1  01-Jan-17  1000.0    NM7      2   ...    $1,015.40   999.0  $32.60  $22.80
2  01-Jan-17  1030.0    NM7      4   ...    $1,015.10    60.0  $32.60  $22.80
3  01-Jan-17  1100.0    NM7      3   ...    $1,014.80   999.0  $32.60  $22.80
4  01-Jan-17  1130.0    NM7      5   ...    $1,014.60   270.0  $32.60  $22.80

然后我用以下行提取时间列:

df["time"] = df.itime

df["time"]

0       1000.0
1       1000.0
2       1030.0
3       1100.0
4       1130.0
5       1200.0
6       1230.0
7       1300.0
8       1330.0
.
.
3261    2130.0
3262    2130.0
3263     600.0
3264     630.0
3265     730.0
3266     800.0
3267     830.0
3268    1900.0
3269    1930.0
3270    2000.0

Name: time, Length: 3279, dtype: float64

然后我尝试将时间列转换为日期时间对象:

df["time"] = pd.to_datetime(df.itime)

产生了以下结果:

df["time"]

0      1970-01-01 00:00:00.000001000
1      1970-01-01 00:00:00.000001000
2      1970-01-01 00:00:00.000001030
3      1970-01-01 00:00:00.000001100

看来它已成功将数据转换为日期时间对象。但是,它将小时时间添加到毫秒,这对我来说很难进行过滤。

我想得到的最终数据格式是:

1970-01-01 06:00:00

06:00

感谢任何帮助。

【问题讨论】:

    标签: python pandas datetime time


    【解决方案1】:

    当您读取 excel 文件时,将 col itimedtype 指定为 str

    df = pd.read_excel("test.xlsx", dtype={'itime':str})
    

    那么您将有一个字符串的时间列,如下所示:

    df = pd.DataFrame({'itime':['2300', '0100', '0500', '1000']})
    

    然后指定格式并转换为时间:

    df['Time'] = pd.to_datetime(df['itime'], format='%H%M').dt.time
    
        itime   Time
    0   2300    23:00:00
    1   0100    01:00:00
    2   0500    05:00:00
    3   1000    10:00:00
    

    【讨论】:

      【解决方案2】:

      只需添加到 Chri 的答案,如果您因为前面没有零而无法转换,请将以下内容应用于数据框。

      df['itime'] = df['itime'].apply(lambda x: x.zfill(4))
      

      所以基本上是因为原始格式甚至没有前导数字(4位)。示例:945 而不是 0945。

      【讨论】:

        【解决方案3】:

        试试

        df["time"] = pd.to_datetime(df.itime).dt.strftime('%Y-%m-%d %H:%M:%S')
        
        
        df["time"] = pd.to_datetime(df.itime).dt.strftime('%H:%M:%S')
        

        对于你想要的第一个和第二个输出

        最好的!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-02-17
          • 2020-08-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-07-22
          相关资源
          最近更新 更多