पांडा डेटाफ़्रेम में यूनिक्स समय को पठनीय तिथि में परिवर्तित करें


110

मेरे पास यूनिक्स समय और इसमें कीमतों के साथ एक डेटाफ्रेम है। मैं सूचकांक कॉलम को परिवर्तित करना चाहता हूं ताकि यह मानव पठनीय तिथियों में दिखाई दे।

उदाहरण के लिए मेरे पास इंडेक्स कॉलम में dateजैसा 1349633705है, लेकिन मैं इसे 10/07/2012(या कम से कम 10/07/2012 18:15) दिखाना चाहूंगा ।

कुछ संदर्भ के लिए, यहां वह कोड है जिसके साथ मैं काम कर रहा हूं और जो मैंने पहले ही कोशिश की है:

import json
import urllib2
from datetime import datetime
response = urllib2.urlopen('http://blockchain.info/charts/market-price?&format=json')
data = json.load(response)   
df = DataFrame(data['values'])
df.columns = ["date","price"]
#convert dates 
df.date = df.date.apply(lambda d: datetime.strptime(d, "%Y-%m-%d"))
df.index = df.date   

जैसा कि आप देख सकते हैं कि मैं df.date = df.date.apply(lambda d: datetime.strptime(d, "%Y-%m-%d"))यहाँ उपयोग कर रहा हूँ जो तब से काम नहीं कर रहा है जब मैं पूर्णांक के साथ काम कर रहा हूँ, तार नहीं। मुझे लगता है कि मुझे उपयोग करने की आवश्यकता है, datetime.date.fromtimestampलेकिन मुझे पूरा यकीन नहीं है कि इसे पूरी तरह से कैसे लागू किया जाए df.date

धन्यवाद।

जवाबों:


221

ये युग के बाद से कुछ सेकंड के लिए दिखाई देते हैं।

In [20]: df = DataFrame(data['values'])

In [21]: df.columns = ["date","price"]

In [22]: df
Out[22]: 
<class 'pandas.core.frame.DataFrame'>
Int64Index: 358 entries, 0 to 357
Data columns (total 2 columns):
date     358  non-null values
price    358  non-null values
dtypes: float64(1), int64(1)

In [23]: df.head()
Out[23]: 
         date  price
0  1349720105  12.08
1  1349806505  12.35
2  1349892905  12.15
3  1349979305  12.19
4  1350065705  12.15
In [25]: df['date'] = pd.to_datetime(df['date'],unit='s')

In [26]: df.head()
Out[26]: 
                 date  price
0 2012-10-08 18:15:05  12.08
1 2012-10-09 18:15:05  12.35
2 2012-10-10 18:15:05  12.15
3 2012-10-11 18:15:05  12.19
4 2012-10-12 18:15:05  12.15

In [27]: df.dtypes
Out[27]: 
date     datetime64[ns]
price           float64
dtype: object

1
और 0.13 में आप date_unit का उपयोग करने में सक्षम होंगे जब read_json: D
एंडी हेडन

महान! आपका समाधान सही समझ में आता है। पंडों: टाइमस्टैम्प्स में परिवर्तित होने से यह बहुत अच्छी तरह से हो जाता है, अब मुझे_दुनिया के बारे में पता है।
WA कार्नेगी

बस एक और बात। यह मेरे लिए 0.11 में काम नहीं करता था, लेकिन 0.12+ में ठीक था
डब्ल्यूए कार्नेगी

1
यह समाधान मुझे देता है OverflowError: Python int too large to convert to C long
अगर __name__

2
कोई बात नहीं, मिलीसेकंड टाइमस्टैम्प था, बस lambda x: x/1000.0, या unit='ms'
अगर __name__

48

यदि आप उपयोग करने का प्रयास करते हैं:

df[DATE_FIELD]=(pd.to_datetime(df[DATE_FIELD],***unit='s'***))

और एक त्रुटि प्राप्त करें:

"pandas.tslib.OutOfBoundsDatetime: यूनिट के 's' के साथ इनपुट नहीं बदल सकता है"

इसका मतलब यह DATE_FIELDसेकंड में निर्दिष्ट नहीं है।

मेरे मामले में, यह मिली सेकंड था - EPOCH time

रूपांतरण ने नीचे का उपयोग करके काम किया:

df[DATE_FIELD]=(pd.to_datetime(df[DATE_FIELD],unit='ms')) 

15

मान लिया कि हमने आयात किया pandas as pdऔर dfहमारी डेटाफ़्रेम है

pd.to_datetime(df['date'], unit='s')

मेरे लिये कार्य करता है।


0

वैकल्पिक रूप से, उपरोक्त कोड की एक पंक्ति को बदलकर:

# df.date = df.date.apply(lambda d: datetime.strptime(d, "%Y-%m-%d"))
df.date = df.date.apply(lambda d: datetime.datetime.fromtimestamp(int(d)).strftime('%Y-%m-%d'))

यह भी काम करना चाहिए।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.