【问题标题】:How to define/format date and time in python如何在python中定义/格式化日期和时间
【发布时间】:2015-10-21 08:10:49
【问题描述】:

我的 cvs 文件有 Datetime 列。将 csv 文件导入 python 后,数据框如下所示:

name      date       time      price    ....
vod     01-Nov-13   00:22.9     99
vod     01-Nov-13   00:23.0     98
vod     02-Nov-13   00:22.9     96
vod     02-Nov-13   00:24.1     92
...      ....        ....       ...
vod     31-Dec-13   00:22.9     99

首先,时间列有问题。这是交易数据,所以时间应该是7:00到16:30。看来python误读了时间格式。

但是,在我按日期对数据进行排序之后。数据是这样的

name      date         ....
vod     01-Nov-13       
vod     01-Dec-13       
vod     02-Nov-13     
vod     02-Dec-13    
vod     03-Nov-13 
vod     03-Dec-13 

再次,日期格式有些错误。时间不应该是这个顺序...

我只有一个问题,如何在 python(pandas) 中定义/格式化日期和时间,以便我可以按顺序对数据进行排序。

【问题讨论】:

  • 您的 CSV 文件在导入 Python 之前是什么样子的?
  • 您能否举例说明 csv 文件中原始数据的外观?例如前几行?这样可以更容易理解这里出了什么问题
  • 您可以使用datetime module将字符串解析为日期并将日期格式化为字符串。
  • @chris-sc csv文件和python输出一模一样。我必须手动更改 csv 的格式吗?
  • @PeterGibson csv 文件与 python 输出完全相同。我必须手动更改 csv 的格式吗?

标签: python sorting date pandas time


【解决方案1】:

你可以使用

来自 Python 日期时间模块的日期时间对象
datetime(年, 月, 日[, 小时[, 分[, 秒[, 微秒[,tzinfo]]]]])

【讨论】:

  • @vignesh,谢谢,你能告诉我把这段代码放在哪里吗?
  • @TristanSun 加载到 Python CSV 文件后将日期和时间列中的数据组合到日期时间对象。在日期列中,您有日期、月份(必须是整数,可以用 dict 更改)和年份(必须用 2013 替换 13)等。
【解决方案2】:

好的,虽然我们不知道您在 csv 中的时间列是什么样的,但我假设它是 hh:mm:ss 格式:

name, date, time, price
vod, 01-Nov-13, 07:40:00, 99
vod, 01-Nov-13, 07:34:50, 95

看看下面这个最小的例子。它使用建议的 csv 输入,将日期和时间列组合成一个日期时间对象。使用 dtype datetime64[ns] 列,pandas 可以轻松对数据进行排序。

#!/usr/bin/python                                                                         
import pandas as pd                                                              

# just write a short example.csv to test this.                                                                       
with open('example.csv', 'w') as f:                                              
    f.write('name, date, time, price\n')                                         
    f.write('vod, 01-Nov-13, 07:40:00, 99\nvod, 01-Nov-13, 07:34:50, 95')                     

# read the csv and use the parse_dates option of pd.read_csv to
# format and combine the date and time columns                                                                        
pdf = pd.read_csv('example.csv', parse_dates=[[1, 2]])                            

# for conveniency: rename the column to datetime                         
pdf.rename(columns={' date_ time': 'datetime'}, inplace=True)

# Sort the dataframe according to the datetime column                 
pdf.sort(columns='datetime', inplace=True)

有关 parse_dates 选项的更多详细信息,请查看文档: http://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_csv.html

如果您的 csv 中的时间格式是 parse_dates 无法处理的,您可以使用 pd.read_csv 中的 converters 选项 - 但为此我们需要知道您的原始数据实际上是什么样的。

【讨论】:

    【解决方案3】:

    所以你有两个问题。

    首先,时间列是错误的。通过评论您说 csv 文件正是您发布的内容。这意味着您获得的数据类似于00:22.9,但您认为这是错误的。由于我们没有可以映射到实际时间的相应数据,因此您可能需要检查时间 00:22.9 是否为 经过时间 或其他( 00:22.9 可能代表07:22.9?)。

    二、日期字符串排序问题。这里我将所有数据转换成一个dict列表如下:(数据是我自己构建的)

    data =
    [{'date': '01-Nov-13', 'name': 'vod', 'price': '98', 'time': '00:23.0'},
    {'date': '01-Jan-13', 'name': 'vod', 'price': '91', 'time': '00:23.0'},
    {'date': '02-Nov-13', 'name': 'vod', 'price': '96', 'time': '00:22.0'},
    {'date': '01-Dec-13', 'name': 'vod', 'price': '101', 'time': '00:23.0'}]
    

    然后使用sorted 函数和datetime 模块(记住sorted 函数将data 改成它自己)

    from datetime import datetime
    sorted(data, key=lambda each_dict: datetime.strptime(each_dict['date'], '%d-%b-%y'))
    

    %d-%b-%y01-Nov-13对应的掩码(日-月-年),其他掩码请查看here

    • 编辑:如果只想解析日期数据,只需调用:

      datetime.strptime(<date_input>, '%d-%b-%y')
      

      这将返回一个日期时间对象,例如:

      datetime.datetime(2013, 11, 1, 0, 0)
      

    整个排序后的数据是:

    [{'date': '01-Jan-13', 'name': 'vod', 'price': '91', 'time': '00:23.0'},
    {'date': '01-Nov-13', 'name': 'vod', 'price': '98', 'time': '00:23.0'},
    {'date': '02-Nov-13', 'name': 'vod', 'price': '96', 'time': '00:22.0'},
    {'date': '01-Dec-13', 'name': 'vod', 'price': '101', 'time': '00:23.0'}]
    

    唯一的问题是,如果您有大量数据集要排序,可能需要一些时间/内存

    【讨论】:

    • 很高兴为您提供帮助,如果您将 3 个答案中的任何一个标记为 Answer 以帮助我和其他人 :) 会更好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-20
    • 2016-05-26
    • 1970-01-01
    • 2010-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多