比较两个日期时间字符串

时间:2019-03-04 16:03:36

标签: python python-datetime datetime-comparison

我有两个DateTime字符串。我将如何比较它们并确定先到哪个?

import pandas as pd
import matplotlib.pyplot as plt 

data = [('cycle',[1,1,2,2,3,3,4,4]),
         ('A',[0.1,0.5,0.2,0.6,0.15,0.43,0.13,0.59]),
         ('B',[ 500, 600, 510,580,512,575,499,598]),
         ]
df = pd.DataFrame.from_items(data)
#print(df)
x = df['A']
y = df['B']

if df['cycle']==2:
    plt.plot(x,y)

2 个答案:

答案 0 :(得分:2)

此格式中包含毫秒,因此time.strptime无法对其进行解析。我选择根据最后一个冒号进行拆分,解析左部分,然后手动转换右部分,将它们加在一起。

A = '2019-02-12 15:01:45:145'
B = '2019-02-12 15:02:02:22'

import time

def parse_date(s):
    date,millis = s.rsplit(":",1)
    return time.mktime(time.strptime(date,"%Y-%m-%d %H:%M:%S")) + int(millis)/1000.0

print(parse_date(A))
print(parse_date(B))

打印:

1549958505.145
1549958522.022

现在比较结果而不是打印它们以获得所需的结果

如果您的毫秒约定不同(例如,此处22也可能表示220),则略有不同。在右边填充零,然后解析:

def parse_date(s):
    date,millis = s.rsplit(":",1)
    millis = millis+"0"*(3-len(millis))   # pad with zeroes
    return time.mktime(time.strptime(date,"%Y-%m-%d %H:%M:%S")) + int(millis)/1000.0

在这种情况下,结果为:

1549958505.145
1549958522.22

答案 1 :(得分:0)

如果两个日期/时间字符串均为ISO 8601格式(YYYY-MM-DD hh:mm:ss),则可以将它们与一个简单的字符串比较进行比较,如下所示:

a = '2019-02-12 15:01:45.145'
b = '2019-02-12 15:02:02.022'

if a < b:
    print('Time a comes before b.')
else:
    print('Time a does not come before b.')

但是,您的字符串中还有一个额外的':',之后是...毫秒?我不确定。但是,如果将它们转换为标准的hh:mm:ss.xxx ...格式,那么您的日期字符串将自然具有可比性。


如果无法更改以hh:mm:ss:xx格式接收这些字符串的事实(我假设xx是毫秒,但只有您可以肯定地说),那么您可以通过解析最终的“:xx”并将其重新附加为“ .xxx”来对字符串进行“调整”,如下所示:

def mungeTimeString(timeString):
    """Converts a time string in "YYYY-MM-DD hh:mm:ss:xx" format
       to a time string in "YYYY-MM-DD hh:mm:ss.xxx" format."""
    head, _, tail = timeString.rpartition(':')
    return '{}.{:03d}'.format(head, int(tail))

然后通过以下方式调用它:

a = '2019-02-12 15:01:45.145'
b = '2019-02-12 15:02:02.022'

a = mungeTimeString(a)
b = mungeTimeString(b)

if a < b:
    print('Time a comes before b.')
else:
    print('Time a does not come before b.')