【问题标题】:Convert any Date String Format to a specific date format string将任何日期字符串格式转换为特定日期格式字符串
【发布时间】:2018-08-30 04:08:58
【问题描述】:

我正在制作一个可以占用任何 csv 文件的通用工具。我有一个看起来像这样的 csv 文件。第一行是列名,第二行是变量类型。 sam.csv

Time,M1,M2,M3,CityName
temp,num,num,num,city
20-06-13,19,20,0,aligarh
20-02-13,25,42,7,agra
20-03-13,23,35,4,aligarh
20-03-13,21,32,3,allahabad
20-03-13,17,27,1,aligarh
20-02-13,16,40,5,aligarh

其他 CSV 文件如下所示:

Time,M1,M2,M3,CityName
temp,num,num,num,city
20/8/16,789,300,10,new york
12/6/17,464,67,23,delhi
12/6/17,904,98,78,delhi

所以,可能有任何日期格式,也可能是时间戳。我想每次都将其转换为“20-May-13”或“%d-%b-%y”格式字符串并对列进行排序从最早的日期到最新的日期。我已经能够搜索类型为“temp”的列名并尝试将其转换为所需的格式,但所有方法都要求我指定原始格式,这在我的情况下是不可能的。 代码 - 导入 csv 进口时间 从日期时间导入日期时间,日期 将熊猫导入为 pd 导入日期工具 从 dateutil.parser 导入解析

filename = 'sam.csv'
data_date = pd.read_csv(filename)
column_name = data_date.ix[:, data_date.loc[0] == "temp"]
column_work = column_name.iloc[1:]
column_some = column_work.iloc[:,0]
default_date = datetime.combine(date.today(), datetime.min.time()).replace(day=1)
for line in column_some:
        print(parse(line[0], default=default_date).strftime("%d-%b-%y"))

在“sam.csv”中,日期为 2013 年。但在我的输出中,它给出了正确的格式,但所有 6 个日期均为 2018 年 3 月 2 日

【问题讨论】:

  • 您需要分享您对 SO 的尝试,否则问题将被关闭。
  • 你可以试试 pandas to_datetime
  • 如果没有一些附加信息,就无法转换 any 日期字符串格式,因为这是不明确的。 02-03-18 是指欧洲 3 月 2 日还是美国 2 月 3 日? 18-03-17 欧洲是 2017 年 3 月 18 日还是日本是 2018 年 3 月 17 日?
  • 我可以给你一些关于它的意见。首先列出您想要支持的所有日期时间格式,然后为它们编写正则表达式,然后使用这些正则表达式找出格式,然后创建日期时间字符串的映射以格式化它们以转换为您想要的格式
  • 如果您有特定格式的列表,您可以使用标准库中的datetime 模块并尝试各种strptime 调用,然后strftime 有效,或者使用第三个-party 库,例如 dateutil,可以自动执行其中的一些工作。选择一个,试着用它做你想做的事情,如果你卡住了,你可以在 SO 上提问,但你不能指望有人猜测你可能想要什么,然后为你编写代码。跨度>

标签: python sorting parsing datetime datetime-format


【解决方案1】:

您可以使用 dateutil 库将任何日期格式转换为您需要的格式。

例如:

import csv
from dateutil.parser import parse
p = "PATH_TO_YOUR_CSV.csv"      #I have used your sample data to test. 

with open(p, "r") as infile:
    reader = csv.reader(infile)
    next(reader)     #Skip Header
    next(reader)     #Skip Header
    for line in reader:
        print(parse(line[0]).strftime("%d-%B-%y"))    #Parse Date and convert it to date-month-year

输出:

20-June-13
20-February-13
20-March-13
20-March-13
20-March-13
20-February-13
20-August-16
06-December-17
06-December-17

MoreInfo on Dateutil

【讨论】:

  • 谢谢! @Rakesh我尝试使用它,但它给了我2018年的日期,但我的原始数据有2013年的日期。我已经更新了问题中的代码。请看一看。
  • 尝试删除解析中的default
  • 删除后它给了我相同的输出
  • 可以发column_some的内容吗
  • 哦,它是一个数据框。在这种情况下,您不需要做 line[0] 只需 line
猜你喜欢
  • 2013-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-12
  • 2020-08-10
  • 1970-01-01
  • 2021-06-10
  • 1970-01-01
相关资源
最近更新 更多