【问题标题】:How to sort a pandas dataframe by date如何按日期对熊猫数据框进行排序
【发布时间】:2018-03-13 14:35:54
【问题描述】:

我正在从 Google BigQuery 将数据导入 pandas 数据框,我想按日期对结果进行排序。我的代码如下:

import sys, getopt
import pandas as pd
from datetime import datetime

# set your BigQuery service account private private key
pkey ='#REMOVED#'
destination_table = 'test.test_table_2'
project_id = '#REMOVED#'

# write your query
query = """
SELECT date, SUM(totals.visits) AS Visits
FROM `#REMOVED#.#REMOVED#.ga_sessions_20*`
WHERE parse_date('%y%m%d', _table_suffix) between
DATE_sub(current_date(), interval 3 day) and
DATE_sub(current_date(), interval 1 day)
GROUP BY Date
    """

data = pd.read_gbq(query, project_id, dialect='standard', private_key=pkey, parse_dates=True, index_col='date')
date = data.sort_index()

data.info()
data.describe()

print(data.head())

我的输出如下所示,你可以看到日期没有排序。

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 3 entries, 0 to 2
Data columns (total 2 columns):
date      3 non-null object
Visits    3 non-null int32
dtypes: int32(1), object(1)
memory usage: 116.0+ bytes
       date  Visits
0  20180312  207440
1  20180310  178155
2  20180311  207452

我已经阅读了几个问题,到目前为止尝试了以下内容,但结果没有改变我的输出:

  • 删除index_col='date' 并添加date = data.sort_values(by='date')
  • 将日期列设置为索引,然后对索引进行排序(如上所示)。
  • 将标题 (headers = ['Date', 'Visits']) 和 dypes (dtypes = [datetime, int]) 设置到我的 read_gbq 行 (parse_dates=True, names=headers)

我错过了什么?

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    我设法通过将我的日期字段转换为日期时间对象来解决这个问题,我认为这将由 parse_date=True 自动完成,但似乎只会解析一个 现有 日期时间对象。

    我在查询后添加了以下内容,以从我的日期字符串创建一个新的日期时间列,然后我能够使用 data.sort_index() 并且它按预期工作:

    time_format = '%Y-%m-%d'
    data = pd.read_gbq(query, project_id, dialect='standard', private_key=pkey)
    
    data['n_date'] = pd.to_datetime(data['date'], format=time_format)  
    
    data.index = data['n_date']
    
    del data['date']
    del data['n_date']
    
    data.index.names = ['Date']
    
    data = data.sort_index()
    

    【讨论】:

      【解决方案2】:

      由于大部分工作都是在 Google BigQuery 端完成的,我也会在那里进行排序:

      query = """
      SELECT date, SUM(totals.visits) AS Visits
      FROM `#REMOVED#.#REMOVED#.ga_sessions_20*`
      WHERE parse_date('%y%m%d', _table_suffix) between
      DATE_sub(current_date(), interval 3 day) and
      DATE_sub(current_date(), interval 1 day)
      GROUP BY Date
      ORDER BY Date
      """
      

      【讨论】:

      • 感谢@MaxU 一个超级轻量级​​的建议,它确实是一个很好的选择。
      • @BenP,很高兴我能帮上忙 :)
      【解决方案3】:

      这应该可行:

      data.sort_values('date', inplace=True)
      

      【讨论】:

      • 如果您的日期类似于01/01/2010,这可能无法正确排序,它将根据它看到的第一个值进行排序。在这种情况下,它将按月(01)而不是按年排序……可能不是这家伙所追求的排序。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-16
      • 2019-04-10
      • 2019-04-12
      • 2021-04-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多