【问题标题】:pandas index filter non datetimes熊猫索引过滤器非日期时间
【发布时间】:2016-04-21 01:30:30
【问题描述】:

我正在读取一个带有日期时间列的 csv 文件,该列具有随机散布的非日期时间文本块(一次一个块中的 5 行,有时一行中的多个块)。请参阅下面的数据文件截图示例:

日期、时间、计数、故障、电池 12/22/2015,05:24.0,39615.0,0.0,6.42 12/22/2015,05:25.0,39616.0,0.0,6.42 12/22/2015,05:26.0,39617.0,0.0,6.42 12/22/2015,05:27.0,39618.0,0.0,6.42 ,,,, 信号发生器 STSO3275,,,, RM,,,, 默认站点,,,, X2CMBasicOpticsBurst,,,, ,,,, 信号发生器 STSO3275,,,, RM,,,, 默认站点,,,, X2CMBasicOpticsBurst,,,, 12/22/2015,19:57.0,39619.0,0.0,6.42 12/22/2015,19:58.0,39620.0,0.0,6.42 12/22/2015,19:59.0,39621.0,0.0,6.42 12/22/2015,20:00.0,39622.0,0.0,6.42 12/22/2015,20:01.0,39623.0,0.0,6.42 12/22/2015,20:02.0,39624.0,0.0,6.42

我可以将剪贴板中的数据读取到数据框中,如下所示:

df = pd.read_clipboard(sep=',')

我正在寻找一种在转换为日期时间索引之前清除非日期格式字符串的“日期”列的方法。我尝试将列转换为索引,然后转换为列表并像这样过滤:

df.index=df['Date']
df = df[~df.index.get_loc('RMR')]
df = df[~df.index.get_loc('Default Site')]
df = df[~df.index.get_loc('X2CMBasicOpticsBurst')]
df = df[~df.index.get_loc('Sonde STSO3275')] 
df = df.dropna()

然后我可以一起解析日期和时间,并使用日期解析工具获得正确的日期时间索引。 但是,文本字段的内容可以更改,并且这种方法似乎非常有限且非 Pythonic。

因此,我正在寻找一种更好、更灵活、更动态的方法来自动跳过索引中的这些非日期字段,希望不必知道其内容的详细信息(例如,在空白行时跳过 4 行块遇到)。

提前致谢。

【问题讨论】:

    标签: python date pandas


    【解决方案1】:

    嗯,你可以使用 to_datetime

    df.loc[:, 'Date'] = pd.to_datetime(df.Date, errors='coerce')
    

    不是日期时间的元素将被转换为 NaT 然后你可以放下它。

    df = df.dropna()
    

    【讨论】:

      【解决方案2】:

      我认为您可以将read_csvdropnato_datetime 一起使用:

      import pandas as pd
      import io
      
      temp=u"""Date,Time,Count,Fault,Battery
      12/22/2015,05:24.0,39615.0,0.0,6.42
      12/22/2015,05:25.0,39616.0,0.0,6.42
      12/22/2015,05:26.0,39617.0,0.0,6.42
      12/22/2015,05:27.0,39618.0,0.0,6.42
      ,,,,
      Sonde STSO3275,,,,
      RMR,,,,
      Default Site,,,,
      X2CMBasicOpticsBurst,,,,
      ,,,,
      Sonde STSO3275,,,,
      RMR,,,,
      Default Site,,,,
      X2CMBasicOpticsBurst,,,,
      12/22/2015,19:57.0,39619.0,0.0,6.42
      12/22/2015,19:58.0,39620.0,0.0,6.42
      12/22/2015,19:59.0,39621.0,0.0,6.42
      12/22/2015,20:00.0,39622.0,0.0,6.42
      12/22/2015,20:01.0,39623.0,0.0,6.42
      12/22/2015,20:02.0,39624.0,0.0,6.42"""
      
      #after testing replace io.StringIO(temp) to filename
      df = pd.read_csv(io.StringIO(temp), parse_dates=[['Date','Time']])
      df = df.dropna()
      df['Date_Time'] = pd.to_datetime(df.Date_Time, format="%m/%d/%Y %H:%M.%S")
      print df
                   Date_Time    Count  Fault  Battery
      0  2015-12-22 05:24:00  39615.0    0.0     6.42
      1  2015-12-22 05:25:00  39616.0    0.0     6.42
      2  2015-12-22 05:26:00  39617.0    0.0     6.42
      3  2015-12-22 05:27:00  39618.0    0.0     6.42
      14 2015-12-22 19:57:00  39619.0    0.0     6.42
      15 2015-12-22 19:58:00  39620.0    0.0     6.42
      16 2015-12-22 19:59:00  39621.0    0.0     6.42
      17 2015-12-22 20:00:00  39622.0    0.0     6.42
      18 2015-12-22 20:01:00  39623.0    0.0     6.42
      19 2015-12-22 20:02:00  39624.0    0.0     6.42
      

      【讨论】:

        猜你喜欢
        • 2019-02-25
        • 1970-01-01
        • 1970-01-01
        • 2013-07-20
        • 1970-01-01
        • 1970-01-01
        • 2021-03-27
        • 2019-02-19
        • 2023-01-12
        相关资源
        最近更新 更多