2010-06-22 8 views
5

में सेकंड्स को [m | h | d | s | w] सेकेंड में व्यक्त की गई समय स्ट्रिंग को कनवर्ट करें [m | h | d | s | w] के प्रारूप में समय का प्रतिनिधित्व करने वाली स्ट्रिंग को परिवर्तित करने के लिए कोई अच्छी विधि है। (एम = मिनट, एच = घंटे, डी = दिन, एस = सेकंड डब्ल्यू = सप्ताह) सेकंड की संख्या के लिए? अर्थात। पाइथन

def convert_to_seconds(timeduration): 
    ... 

convert_to_seconds("1h") 
-> 3600 

convert_to_seconds("1d") 
-> 86400 

आदि?

धन्यवाद!

उत्तर

10

हाँ, वहाँ एक अच्छा सरल विधि है कि आप एक datetime पुस्तकालय के लिए मैनुअल को पढ़ने के लिए बिना सबसे अधिक भाषाओं में उपयोग कर सकते हैं। इस विधि भी औंस/पाउंड/टन आदि आदि को वाग्विस्तार जा सकता है:

seconds_per_unit = {"s": 1, "m": 60, "h": 3600, "d": 86400, "w": 604800} 

def convert_to_seconds(s): 
    return int(s[:-1]) * seconds_per_unit[s[-1]] 
+0

हाहा, +1 और ब्रावो, मुझे शर्मिंदा है कि यह मेरे लिए नहीं हुआ! मैं अभी भी अनुशंसा करता हूं कि हर कोई इस तरह के कार्य के लिए 'डेटाटाइम' लाइब्रेरी और 'टाइमडेल्टा' वर्ग का उपयोग कैसे करें, क्योंकि कई मामलों में यह सबसे सुविधाजनक विकल्प होगा। हालांकि, मुझे यह स्वीकार करना होगा कि इस विशेष प्रश्न के लिए मेरा समाधान मेरे से बेहतर है। –

+0

हाँ +1 यह जो मैं चाहता था उसे प्राप्त करने के लिए यह एक साधारण, सुरुचिपूर्ण विधि है .. धन्यवाद! – Andrew

7

मैं datetime मॉड्यूल से the timedelta class उपयोग करने की अनुशंसा:

from datetime import timedelta 

UNITS = {"s":"seconds", "m":"minutes", "h":"hours", "d":"days", "w":"weeks"} 

def convert_to_seconds(s): 
    count = int(s[:-1]) 
    unit = UNITS[ s[-1] ] 
    td = timedelta(**{unit: count}) 
    return td.seconds + 60 * 60 * 24 * td.days 

आंतरिक रूप से, timedelta वस्तुओं के रूप में माइक्रोसेकंड, सेकंड, और दिन सब कुछ की दुकान। इसलिए जब आप इसे मिलीसेकंड या महीनों या वर्षों जैसे इकाइयों में पैरामीटर दे सकते हैं, तो अंत में आपको timedelta लेना होगा और सेकंड में कनवर्ट करना होगा।

यदि ** वाक्यविन्यास आपको भ्रमित करता है, तो यह पायथन apply वाक्यविन्यास है। असल में, इन फ़ंक्शन कॉल सब बराबर हैं:

def f(x, y): pass 

f(5, 6) 
f(x=5, y=6) 
f(y=6, x=5) 

d = {"x": 5, "y": 6} 
f(**d) 
+0

मैं कसम खाता हूँ मैं अपने जवाब ;-) +1 कॉपी नहीं किया था और मुझे लगता है कि मैं मेरा हटा देंगे। –